Tidak ada "callback" di C - tidak lebih dari konsep pemrograman generik lainnya.
Mereka diimplementasikan menggunakan pointer fungsi. Ini sebuah contoh:
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
for (size_t i=0; i<arraySize; i++)
array[i] = getNextValue();
}
int getNextRandomValue(void)
{
return rand();
}
int main(void)
{
int myarray[10];
populate_array(myarray, 10, getNextRandomValue);
...
}
Di sini, populate_array
fungsi mengambil pointer fungsi sebagai parameter ketiga, dan memanggilnya untuk mendapatkan nilai untuk mengisi array. Kami telah menulis panggilan balik getNextRandomValue
, yang mengembalikan nilai acak-ish, dan meneruskan pointer ke sana populate_array
. populate_array
akan memanggil fungsi panggilan balik kami 10 kali dan menetapkan nilai yang dikembalikan ke elemen dalam array yang diberikan.
Berikut adalah contoh panggilan balik di C.
Katakanlah Anda ingin menulis beberapa kode yang memungkinkan pendaftaran panggilan balik dipanggil saat beberapa peristiwa terjadi.
Pertama-tama tentukan jenis fungsi yang digunakan untuk callback:
Sekarang, tentukan fungsi yang digunakan untuk mendaftarkan panggilan balik:
Kode ini akan terlihat seperti yang mendaftarkan panggilan balik:
Di bagian internal pengirim acara, panggilan balik dapat disimpan dalam struct yang terlihat seperti ini:
Ini adalah kode yang mengeksekusi panggilan balik.
sumber
libsrtp
tidak memberikan peringatan. Saya menduga, kemudian, bahwa ketika jenis seperti itu muncul sebagai argumen fungsi, diperlukan untuk 'meluruh' ke fungsi-pointer, sama seperti array peluruhan ke pointer ke elemen pertama mereka, sehingga hal yang sama terjadi pada akhirnya bagaimanapun juga. Ini adalah menarik, meskipun, bahwa diskusi dari typedef seperti saya telah menemukan bahkan tidak melirik aspek ini, lebih fokus pada mendeklarasikan prototipe atau pointer dengan ituProgram panggilan balik sederhana. Semoga ini menjawab pertanyaan Anda.
sumber
Fungsi panggilan balik dalam C adalah setara dengan parameter fungsi / variabel yang ditetapkan untuk digunakan dalam fungsi lain. Contoh Wiki
Dalam kode di bawah ini,
Fungsi (* numberSource) di dalam panggilan fungsi PrintTwoNumbers adalah fungsi untuk "memanggil kembali" / mengeksekusi dari dalam PrintTwoNumbers seperti yang ditentukan oleh kode saat dijalankan.
Jadi jika Anda memiliki sesuatu seperti fungsi pthread, Anda dapat menetapkan fungsi lain untuk dijalankan di dalam loop dari instantiasinya.
sumber
Panggilan balik dalam C adalah fungsi yang disediakan untuk fungsi lain untuk "memanggil kembali ke" di beberapa titik ketika fungsi lain melakukan tugasnya.
Ada dua cara callback digunakan : callback sinkron dan callback asinkron. Callback sinkron disediakan untuk fungsi lain yang akan melakukan beberapa tugas dan kemudian kembali ke pemanggil dengan tugas selesai. Callback asinkron disediakan untuk fungsi lain yang akan memulai tugas dan kemudian kembali ke pemanggil dengan tugas yang mungkin tidak selesai.
Callback sinkron biasanya digunakan untuk memberikan delegasi ke fungsi lain yang fungsi lain mendelegasikan beberapa langkah tugas. Contoh klasik dari delegasi ini adalah fungsi
bsearch()
danqsort()
dari C Standard Library. Kedua fungsi ini mengambil panggilan balik yang digunakan selama tugas fungsi menyediakan sehingga jenis data yang dicari, dalam kasusbsearch()
, atau diurutkan, dalam kasusqsort()
, tidak perlu diketahui oleh fungsi yang sedang bekas.Misalnya di sini adalah program sampel kecil dengan
bsearch()
menggunakan berbagai fungsi perbandingan, panggilan balik sinkron. Dengan memungkinkan kami mendelegasikan perbandingan data ke fungsi panggilan balik,bsearch()
fungsi ini memungkinkan kami untuk memutuskan pada waktu berjalan perbandingan apa yang ingin kami gunakan. Ini sinkron karena ketikabsearch()
fungsi mengembalikan tugas selesai.Callback asinkron berbeda karena ketika fungsi yang dipanggil di mana kami memberikan panggilan balik, tugas mungkin tidak selesai. Jenis panggilan balik ini sering digunakan dengan I / O asinkron di mana operasi I / O dimulai dan kemudian ketika selesai, panggilan balik dipanggil.
Dalam program berikut ini kami membuat soket untuk mendengarkan permintaan koneksi TCP dan ketika permintaan diterima, fungsi melakukan mendengarkan kemudian memanggil fungsi panggilan balik yang disediakan. Aplikasi sederhana ini dapat dilakukan dengan menjalankannya di satu jendela saat menggunakan
telnet
utilitas atau browser web untuk mencoba terhubung di jendela lain.Saya mengangkat sebagian besar kode WinSock dari contoh yang disediakan Microsoft dengan
accept()
fungsi di https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspxAplikasi ini memulai
listen()
pada host lokal, 127.0.0.1, menggunakan port 8282 sehingga Anda dapat menggunakan salah satutelnet 127.0.0.1 8282
atauhttp://127.0.0.1:8282/
.Aplikasi sampel ini dibuat sebagai aplikasi konsol dengan Visual Studio 2017 Community Edition dan menggunakan soket versi Microsoft WinSock. Untuk aplikasi Linux, fungsi WinSock perlu diganti dengan alternatif Linux dan pustaka thread Windows akan digunakan
pthreads
sebagai gantinya.sumber
Panggilan balik dalam C biasanya diimplementasikan menggunakan pointer fungsi dan pointer data terkait. Anda meneruskan fungsi
on_event()
dan pointer data Anda ke fungsi kerangka kerjawatch_events()
(misalnya). Ketika suatu peristiwa terjadi, fungsi Anda dipanggil dengan data Anda dan beberapa data khusus acara.Callback juga digunakan dalam pemrograman GUI. The GTK + tutorial memiliki bagian bagus di teori sinyal dan callback .
sumber
Ini artikel wikipedia memiliki contoh di C.
Contoh yang baik adalah bahwa modul-modul baru ditulis untuk menambah register server Web Apache dengan proses apache utama dengan mengirimkan mereka fungsi pointer sehingga fungsi-fungsi tersebut dipanggil kembali untuk memproses permintaan halaman web.
sumber
Biasanya ini dapat dilakukan dengan menggunakan pointer fungsi, yaitu variabel khusus yang menunjuk ke lokasi memori suatu fungsi. Anda kemudian dapat menggunakan ini untuk memanggil fungsi dengan argumen tertentu. Jadi mungkin akan ada fungsi yang mengatur fungsi panggilan balik. Ini akan menerima pointer fungsi dan kemudian menyimpan alamat itu di suatu tempat di mana ia dapat digunakan. Setelah itu ketika peristiwa yang ditentukan dipicu, ia akan memanggil fungsi itu.
sumber
Jauh lebih mudah untuk memahami ide melalui contoh. Apa yang telah diberitahukan tentang fungsi panggilan balik di C sejauh ini adalah jawaban yang bagus, tetapi mungkin manfaat terbesar dari menggunakan fitur ini adalah untuk menjaga kode tetap bersih dan tidak berantakan.
Contoh
Kode C berikut mengimplementasikan penyortiran cepat. Baris paling menarik dalam kode di bawah ini adalah yang ini, di mana kita bisa melihat fungsi callback beraksi:
Compare_s2b adalah nama fungsi yang digunakan qsort () untuk memanggil fungsi. Ini membuat qsort () jadi tidak berantakan (karenanya lebih mudah dirawat). Anda cukup memanggil fungsi dengan nama dari dalam fungsi lain (tentu saja, deklarasi prototipe fungsi, paling tidak, harus didahului sebelum dapat dipanggil dari fungsi lain).
Kode Lengkap
sumber