dポイントプレゼントキャンペーン実施中!

コールバック関数ってどうしてコールバックというのでしょう?何を呼び戻すんでしょう?

A 回答 (4件)

コールバック関数自身がコールバック(呼び戻し)されると言うことです。



** 例 **
GUI環境で動作するプログラムがあり、そのウィジェット(widget:小さな部品)としてプッシュボタンがあったとします。
プッシュボタンがクリックされると、通常は何かの動作をするわけですが、その動作させたいことをコールバック関数に記述しておき、プッシュボタンが押されたときにコールバック関数が呼び出されるようにしておきます。

プログラムとしてわかりやすいのは、X Window Systemになってしまいますが、gtk+によるコールバック関数がわかりやすいのではないでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございました
呼び出されるほうがコールバック関数というのですね
では呼び出されることがなくて、実体はあったとしてもコールバック関数と呼ぶのでしょうか

int testa(a,b){
return(a+b);
}

//Testb(testa);
コメントアウトしたら、testaはコールバック関数ではないということでしょうか?

わかりづらくてすみません

お礼日時:2005/04/04 15:50

仕事で書いているプログラムの例です。


A: デバイスドライバ
B: Aをコールするモジュール#1
C: Aをコールするモジュール#2

BがAをコールするとき、Aにコールバック関数を引数で渡す。
Aはデバイスアクセス起動。
デバイスアクセス完了後、割り込み発生。
AモジュールはBからもらったコールバック関数をコール。

Cだったら、Cからもらったコールバック関数をAがコールすることになります。

こんなイメージだと思います。
    • good
    • 0
この回答へのお礼

なんとなくわかりました
ありがとうございました

お礼日時:2005/04/06 20:57

#1に回答したものです。



コールバック関数は、プログラム中から普通に呼び出されるのではなくて、GUI環境から(正確にはオペレーティングシステムから)呼び出されます。

わたしの使っているシステム(X Window System)では、

1. 関数の定義(特にコールバック関数であることは明記しない)
2. 1.で定義した関数がどのイベント(プッシュボタンが押されたとかチェックボックスがチェックされたとか)で「コールバック」されるかを定義 … シグナルコネクト(signal connect)と言います。

の2つのコードが必要になります。

** 例 **
// ボタン押されたときの関数
void button_pushed (GtkWidget *widget, gpointer *data)
{
g_print ("Button was pushed.\n");
}

int main (int argc, char *argv[])
{

.....

// 先に定義したbutton_pushed()と"clicked"(ボタンがクリックされたら)を関連付ける。
gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (button_pushed), NULL);

.....

gtk_main ();
return 0;
}
    • good
    • 0
この回答へのお礼

なんとなくわかりました
ありがとうございました

2度もありがとうございました

お礼日時:2005/04/06 20:56

コールバックの意味自体は、既に回答が出ていますが、具体例を試すのは割と簡単です。



例えば、atexitで登録する終了時関数やsignalで登録するシグナル処理ルーチンがそうです。こういったものであれば、10行程度のプログラムで確認できると思います。

#include <stdio.h>
#include <stdlib.h>

void callback(void) { puts("callback"); }

int main(void)
{
 atexit(&callback);
 return 0;
}
    • good
    • 0
この回答へのお礼

わかりやすいご説明ありがとうございました

お礼日時:2005/04/04 16:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!