2003-11-03

コールバック関数

 「callback」という単語を英和辞典で調べると
「(電話を)後で掛け返す」や「折り返し電話をかけること」とでていた。

電話でのコールバックは、ダイヤルして通じれば、自分の電話番号を伝えて
電話を切り相手方から電話の掛かってくるのを待つ事を言う。

コールバック関数も同じように、ある関数にコールバックしてもらう関数を教えて、
関数が呼び出されるのを待つ仕組みだ。


コールバックのサンプルプログラムリスト

#include <stdio.h>

/*  コールバック関数 */
typedef int (*TEST_CALLBACK)(int i); /* コールバック関数の形 */

int  test_a(int mode,TEST_CALLBACK b) {
    static TEST_CALLBACK a=NULL;
    int  rc;
    if(mode==1) { /* コールバックする関数を設定 */
        a=b;
        return 0;
    }
    if(a==NULL) {
        printf("コールバック関数が設定されていません");
        return 0;
    }
    rc=a(1);  /* test_b()を呼び出す */
    printf("test_a() rc=%d\n",rc);
    return 0;
}

int  test_b(int i) {
    printf("test_b() i=%d\n",i+100);
    return i+200;
}

int main(void)
{
    test_a(0,NULL);   /* コールバック関数を設定しないで呼び出す */
    test_a(1,test_b); /* コールバック関数を設定する */
    test_a(0,NULL);   /* ここから呼び出しても面白くないが、テストのため */
    return 0;
}

サンプルプルグラムの説明 typedefでコールバックする関数のポインタを宣言する。 サンプルプログラムの中では  typedef int (*TEST_CALLBACK)(int i); としている。 test_b()関数はコールバックされる関数で、test_a()関数はコールバック関数を呼び出す関数。 サンプルのプログラムでは単純に、コールバック関数のポインタを事前に記憶させておき、 コールバック関数を呼び出す。 実際のプログラムでは、呼び出すタイミングがキー入力であったりとか、 割り込みが起きたときとか、処理の途中経過を教えるものだったりとかになると思う。
戻る