• ベストアンサー

コールバックって・・・

コールバックって・・・ はじめまして、質問があります。 コールバックとはどういう意味でしょうか? コールバックは普通の関数呼び出しと何か違いがありますか。 [現在のイメージ] ・下位関数が上位の関数をコールすること ・マルチタスクでないと使用できない ・イベントドリブンでないと使用できない ・割り込み的なもの? ご存知の方いらっしゃいましたら、どうか御教授ください。

noname#150259
noname#150259

質問者が選んだベストアンサー

  • ベストアンサー
  • yuipu
  • ベストアンサー率38% (18/47)
回答No.7

関数の引数として、他の関数のアドレス(コール先)を渡してそれを実行してもらいたいとき、その関数をコールバックというんじゃない? sort の場合だったら、呼び出し側として「heapやらquickとか方法があるけど今回はこのSortロジックを使ってください」的に、自前で用意したsort関数を引数としておおもとのSortに渡す。 スレッドとかイベントとかとは関係ないですよ。 こんなページもありました。参考に。 http://www2.biglobe.ne.jp/~sakai/callback.htm

その他の回答 (6)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

一番簡単なコールバックは、次のようなものです。 #include <stdio.h> void foo(void (*f)(void)) {  (*f)(); } void bar(void) {  puts("barを呼び出した"); } int main(void) {  foo(&bar);  return 0; } これを応用すると、関数へのポインタをどこかに保持しておいて、何らかのタイミングでそれを呼び出すといったこともできます。 なお、標準関数でもコールバックは普通に使われています。 具体的には、atexit, bsearch, qsort, signalがそれにあたります。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.5

#2です。 すみません、アレではイベントドリブンの説明ですね。 定義では「他の関数に引数として渡され、その関数の中で実行される関数」という事のようです。 呼び出し先の動作が一部抽象化されている場合(#3のqsort()で言うなら2値の比較が抽象化されている)、それを具象化するために用いる訳です。

参考URL:
http://ja.wikipedia.org/wiki/コールバック_(情報工学)
noname#150259
質問者

お礼

回答ありがとうございます。 教えて頂いたURLを参考に致します。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

私のイメージは抽象的な概念だけライブラリ等で定義してあり具体的な内容はプログラマが自由に定義できるというイメージですね

  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.3

C言語の標準関数の一つとして配列をソートする関数qsortがありますが、qsortの呼び出し形式は void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *)); です。 アプリケーションは予め int comp(const void *, const void *); の形の、2つの配列の要素を比較する関数を用意して*comparの所にcompを指定してqsort関数を使用します。アプリケーションの作成者はqsortのロジックを変更することなく、自作のcomp関数の中身を変えることでソートの順番を変えることができます。 この場合compはコールバック関数ですがマルチタスクともイベントドリブンとも割り込みとも関係がありません。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

通常の関数呼び出しが「その場所で能動的に呼ぶもの」であるのに対して、コールバックは「何かのトリガーに応じて、受動的に呼ばれるもの」であるという差があります。 その性質上、トリガーとコールバック関数の対応付けは予め行っておかないと動作しません。 割り込みハンドラも大抵はコールバックの一つですから、シングルタスクでもコールバックは動いていることになります。

回答No.1

Windows API では、「ある条件の時に(イベント発生時などに)、この関数を呼んでね」と OS にお願いして、指定した関数を OS から呼んでもらうことを指します。 例えば、EnumWindows 関数は、「Window を列挙して、Window がみつかる度にこの関数を呼んでね」とお願いするわけです。 ヘルプやMSDNなどでEnumWindows 関数を調べるとわかりますが、「この関数を呼んでね」の「この関数」はEnumWindows 関数のパラメータで指定します。 APIとは関係なく、通信の分野でも、「こちらに接続してね」とお願いすることを指します。(こちらから接続して、お願いが終わったら一旦接続を切り、相手が接続してくれるのを待ちます) 通信に関しては、セキュリティ上の理由などで、このような回りくどいことをしなければならない場合があります。

noname#150259
質問者

お礼

回答ありがとうございます。

関連するQ&A

  • コールバック関数について

    コールバック関数の意味は、 特定の条件が成り立った時に呼び出してもらうだと思うんですが、 コールバック関数を使うメリット・利点は何なんでしょうか?

  • コールバックって何?

    はじめまして、_IXTLと申します。 仕事場でコールバック関数という言葉を聞きました。 呼び出し先にあらかじめ呼び出す関数を覚えさせておく 手法(うろおぼえ)とか…何とか…。 (確か、複数の関数ポインタのテーブルを持たせていたような気がします) Wikipediaなどでも調べましたが、意味が分かりません。 この意味や、メリットなどを詳しく教えて頂けないでしょうか? お願いします。

  • 【php】コールバック関数ってなんですか?

    【php】コールバック関数ってなんですか? コールバック関数ってどういうものなのでしょうか? 個人的になイメージでは このライブラリの、このボタンを押した時 hoge()という関数が実行されるように設計しておいたから ボタンを押した時に何か動作が必要な場合は hoge()という名前で関数を定義しておいてね。 みたいな感じでしょうか?

    • ベストアンサー
    • PHP
  • イベントドリブン(C言語)

    イベントドリブン(C言語) こんにちわ、質問があります。 とあるイベントドリブン型のプログラムについて説明をされました。 ソフトはOS(元はハード)からManagerと言われる管理タスクにイベントが 飛んでいき、Managerから各タスクの関数がコールされる仕組みだそうでです。 また、それだけでなくOSから各タスクのコールバック(?)関数がコールされる事も あるそうです。 ◆質問 ここでいうイベントとは何なんでしょうか? 結局C言語なので、イベントと呼ばれているモノは関数コールなんでしょうか? C言語でイベントドリブン型プログラムを作成した事がある方、 自分ならこう作るぞという方、教えてください。

  • コールバック関数と、再帰関数の違いってなんですか?

    コールバック関数と、再帰関数の違いってなんですか?

  • コールバック関数

    お世話になります。VB.NETにてソフト制作をしています。 今回、DLLの関数を利用する事になりましたが、うまく宣言できず困っています。御教授お願いします。 DLLはC++で作られており変更できません。 DLLは通信を補助するための物で、初期設定の関数と通信開始の物があります。 初期設定用を呼んだ後、通信開始を行なうようです。 説明には下記のような内容がありました。 【初期設定用】  initial(DWORD ip, LPNOTIFICATIONFUNC notificationFunc); ip=相手先のipアドレス  notificationFunc=コールバック関数へのポインタ コールバック関数    WINAPI *PNOTIFICATIONFUNC( DWORD id, BYTE bySet1, BYTE bySet2, BYTE bySet3, BYTE *data, DWORD datasize ); 【通信開始用】  start(DWORD ip BYTE *code ); ip=通信元のipアドレス code=相手のコードの格納アドレス 以上 全体的にどう宣言したら良いのか解りません。 (特にコールバック関数の宣言と、ポインタへの引数の渡し方) すみませんが、御教授お願いします。

  • jQueryのコールバック関数の実行順序について

    いつもお世話になっております。 jQueryのコールバック関数について質問させて下さい。 jQueryの関数には引数としてコールバック関数を取るものがありますが、これらの実行順序で悩んでいます。 実行順序に関して、呼び出し元関数の実行が完了した後にコールバック関数が実行されるという認識で間違いないでしょうか? 以前、実行順序は保証されないという記述を見たのですが、どこで見たのか失念してしまい、再度読み直す事ができないでいます。 以上の事に関してご教授下さい。 宜しくお願い致します。

    • ベストアンサー
    • AJAX
  • コールバックでイベントを使うメリットは何でしょうか

    コールバック関数を実行するのに、わざわざイベントを使う利点は何でしょうか。 下記のコードでは、どちらでも大して変わらないように見えますが・・・ Module modMain Sub Main() Dim myRaise As clsMyRaiseEvent = New clsMyRaiseEvent 'イベントを使った使用法 AddHandler myRaise.MyEvent, New clsMyRaiseEvent.dlgMyEvent(AddressOf MyCallBack) myRaise.Test1() '関数ポインタ的な使用法 myRaise.callback = New clsMyRaiseEvent.dlgMyEvent(AddressOf MyCallBack) myRaise.Test2() Console.ReadLine() End Sub 'コールバック関数 Private Sub MyCallBack(ByVal aEx As Exception) Console.WriteLine("Called") End Sub End Module Public Class clsMyRaiseEvent Public Delegate Sub dlgMyEvent(ByVal aEx As Exception) Public Event MyEvent As dlgMyEvent 'デリゲート型のイベント Public callback As dlgMyEvent Public Sub Test1() RaiseEvent MyEvent(New Exception) End Sub Public Sub Test2() callback(New Exception) End Sub End Class

  • コールバック関数 再び

    またまた、お世話になります。前回、御回答頂き動作するようにはなったのですが、コールバックに入力があった時に、アプリケーションが終了してしまう現象がおきています。御教授お願いします。 C++で作られたDLLを利用。 装置との通信を行なう物で初期設定用と通信開始用の 関数があり、コールバック関数で、装置からの送信もある。このDLLを使った、他のアプリで動作確認は取れているのでDLL自体には問題ないと思われる。 関数説明 【初期設定用】  initial(DWORD ip,LPNOTIFICATIONFUNC notificationFunc); ip=相手先のipアドレス notificationFunc=コールバック関数へのポインタ コールバック関数 WINAPI *PNOTIFICATIONFUNC(  DWORD id,  BYTE bySet1,  BYTE bySet2,  BYTE *data,  DWORD datasize); 以上の説明があり、現在下記のように宣言して使っています。 【初期設定用】 Declare Function MT_INITIALIZE Lib "TEST.dll" Alias "Initial" _  (ByVal ip As Integer, ByVal notificationFunc As CallBack) As Boolean Public Delegate Sub CallBack( _  ByVal id As Integer, _ ByVal byset1 As Byte, _ ByVal byset2 As Byte, _ ByVal data As IntPtr, _ ByVal dataSize As Integer) 【コールバック関数】 Public Shared Sub notificationFunc( _  ByVal id As Integer, _ ByVal byset1 As Byte, _ ByVal byset2 As Byte, _ ByVal data As IntPtr, _ ByVal dataSize As Integer )   //データのバッファ処理 End Sub

  • matlabでのエラー コールバック??

    matlabのエラーについてお聞きしたいのですが・・・ あるシミュレーションを実行しましたら以下のようなエラーが出ました。 MPC block (mask) 'MPC Controller'の'InitFcn'コールバックの実行中にエラーが発生しました。 エラー ==> @mpc\private\mpc_estimator の 52 行目 Problems encountered when designing the overall state observer (Kalman filter). 上の文では「コールバックの実行中」というのが意味がわかりません。コールバックとぐぐってみても電話回線の話などが出てきて、肝心な制御の話はほとんどありませんでした。 下の英語の文は訳せはするんですが、何を言っているのかは意味不明です・・・。 この二文はいったいどういったときに出るエラーなのか。あとmatlabでいうコールバックとはいったいどういったことなのか。もしご存知ある方がいましたら、是非ご指導願います。よろしくお願いします。

専門家に質問してみよう