Olen nyt hieman vääntänyt C++:lla, mutta tuli tälläisiä englannin kielisiä termejä vastaan mitä en tunne:
- function callbacks
- function pointers
Voisiko joku ystävällisesti selittää mitä nuo callbacksit ja pointersit ovat? Siis, vaikka yksinkertainen esimerkki missä nuolella (tai muulla vastaavalla merkillä) on näytettynä selkeästi mikä osa functiota on nimiteltään pointer ja mikä osa on callback.
Asia avautunee helpoiten esimerkkien avulla.
Callback-funktio on oma funktiosi johon annat osoittimen (pointer) jollekin funktiolle ja se sitten kutsuu sitä (noin niinkuin yksinkertaistettuna). Periaatteessa Windowsissa ikkunahandlerikin on callback-funktio.
Esimerkki: (Windows API, SetTimer-funktio)
VOID CALLBACK myCallback(HWND hwnd, UINT uMsg, UINT_PTR Event, DWORD dwTime); /* -- koodia -- */ SetTimer(NULL, NULL, 1000, myCallback) /* -- koodia -- */ VOID CALLBACK myCallback(HWND hwnd, UINT uMsg, UINT_PTR Event, DWORD dwTime) { /* Windows kutsuu tätä funktiota */ }
Toinen esimerkki callbackia käyttävästä funktiosta on EnumWindows. C-standardikirjastosta löytyvä sorttausrutiini qsort käyttää myös callbackia.
Funktiopointteri on osoitin funktioon, eli funktion osoite.
Katso lisää tietoa callbackeista ja funktio-osoittimista: http://www.function-pointer.org/
Ymmärsinkö oikein: callback on lyhyesti ja ytimekkäästi sanottuna functio joka kutsuu toista functiota?
Callback on funktio sun ohjelmassa, JOTA rajapinta (esimerkissä siis WinAPI) kutsuu.
Siis pähkinänkuoressa:
Sulla on funktio "ajastin":
funktio ajastin(parametri1, mitä tehdään) { kun aika == parametri1:n arvo tee mitä "mitä tehdään" parametrissä käsketään. }
funktio soitaAani(tiedosto) { soitetaan tiedosto. }
sitten kutsutaan:
ajastin(10 minuuttia, soitaAani(herätyskello.wav))
Ihku esimerkki...
Funktio-osoitin on ihan tavallinen osoitin (kai tiedät mikä osoitin on) paitsi, että se osoittaa muuttujan sijasta funktioon. Funktiota voidaan sitten kutsua tämän osoittimen kautta.
Esim
#include <stdio.h> void f1(int a) { printf("Hello world: %d\n", a); } void f2(int a) { printf("Terve maailma: %d\n", a); } int main(void) { // Luo osoitin. Huomaa sulut! void (*fo)(int); // Tulostaa "Hello world: 2" fo=f1; fo(2); // Tulostaa "Terve maailma: 4" fo=f2; fo(4); return 0; }
"void (*fo)" on siis eri asia kuin "void *fo". Ensimmäinen on fo niminen osoitin funktioon, kun taas jälkimmäinen on funktio nimeltä fo, joka palauttaa "void *" tyypisen arvon.
Callback on funktio-osoitin, joka annetaan parametrina toiselle funktiolle.
Callback:inä käytettävän funktion eteen kirjoitetaan CALLBACK, jotta kääntäjä ei tee mitään tyhmää (kuten optimointeja), joka estää funktion käyttämisen callback:inä.
Esim
#include <windows.h> #include <stdio.h> void CALLBACK cb1(int a) { printf("Tämän ensimmäinen callback: %d\n", a); } void CALLBACK cb2(int a) { printf("Tämän toinen callback: %d\n", a); } void kutsuja(void CALLBACK (*cb)(int)) { // Kutsu callback-funktiota 10 kertaa for (int i=0; i<5; i++) cb(i); } int main(void) { // Tulostaa luvut 0-4 kutsuja(cb1); // Tulostaa luvut 0-4 kutsuja(cb2); return 0; }
Ja tarkennettakoon vielä että CALLBACK on siis windows.h:sta löytyvä systeemi, ei mikään C- tai C++-kielen ominaisuus. Se ei välttämättä myöskään käske kääntäjää olemaan tekemättä mitään tyhmää. Luultavasti ainakin Windowsilla se määrittelee funktion kanssa käytettävän stdcall-tapaa kutsua funktiota.
Tuosta Meitsin esimerkistä ei ota Erkkikään (TM) selvää; se kannattanee jättää omaan arvoonsa :)
fawkz kirjoitti:
Tuosta Meitsin esimerkistä ei ota Erkkikään (TM) selvää; se kannattanee jättää omaan arvoonsa :)
:< Pöh.
Aihe on jo aika vanha, joten et voi enää vastata siihen.