Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Termistö - C++

Sivun loppuun

Queq [22.10.2004 14:16:00]

#

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.

thefox [22.10.2004 14:51:51]

#

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/

Queq [22.10.2004 16:20:57]

#

Ymmärsinkö oikein: callback on lyhyesti ja ytimekkäästi sanottuna functio joka kutsuu toista functiota?

Blaze [22.10.2004 17:33:23]

#

Callback on funktio sun ohjelmassa, JOTA rajapinta (esimerkissä siis WinAPI) kutsuu.

Meitsi [22.10.2004 18:44:37]

#

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...

Markus [22.10.2004 20:22:10]

#

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;
}

thefox [23.10.2004 00:07:01]

#

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 :)

Meitsi [23.10.2004 00:28:43]

#

fawkz kirjoitti:

Tuosta Meitsin esimerkistä ei ota Erkkikään (TM) selvää; se kannattanee jättää omaan arvoonsa :)

:< Pöh.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta