• 締切済み

コールバック関数とは…(C言語)

関数をコールバックするのと、 関数を直接呼ぶのとではどう違うのでしょうか? ※質問がおかしかったらすいません。

みんなの回答

  • higeG
  • ベストアンサー率22% (4/18)
回答No.4

コールバック関数は、「何かしらのフレームワークを作る際に汎用性を高めるため」に使います。 ここで言うフレームワークとは、OSやドライバ、ミドルウェアなど、アプリケーションプログラムが使用する共通モジュールを指します。 これらのフレームワークを設計する際には、個々のアプリケーションが何をするプログラムなのかは分かっていないので、 その関数を実行する手順やタイミングだけ決めておき、実際に何をするかはアプリケーションのプログラマに委ねられます。 前出のウィンドウプロシージャ(WinProc)は、Windowsからイベントを受信した時の処理を、 qsortは渡された配列の並べ替えをする時の大小比較の仕方をアプリケーションプログラマが決められるようにする訳です。 フレームワークの設計者(Windowsの設計者やANSI C言語を考えた人達)は、その仕組みを提供しているだけです。

全文を見る
すると、全ての回答が全文表示されます。
  • tea_sheep
  • ベストアンサー率53% (8/15)
回答No.3

コールバック関数は、システムや呼び出し先の関数が呼び出し返してくる アプリケーション定義の関数のことです。 代表的なのは、C標準関数のクイックソートqsort関数の第4引数に渡す 比較用関数ですね。qsortは、並べ替え処理の実行中に、要素の順序を決定 するために、アプリ側が準備している比較用関数を呼び出し返してきます。 Windowsだと、No2の方が示されているウィンドウプロシージャだとか、 「Enum***」系のAPIに渡すアプリ定義の関数が該当します。

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★『WindowProc』は最も代表的なコールバック関数です。 ・このウインドウ・プロシージャ関数は通常、WinMain() 関数のメッセージ・ループ内で  呼び出されます。Windows からメッセージ情報がメッセージ・キューへ入ると1つ1つを  取り出してコールバック関数である『WindowProc』を呼び出します。これを行っているのが  『DispatchMessage()』関数です。この関数がコールバック関数のウィンドウ・プロシージャを  内部で呼び出して、送出したメッセージを『WindowProc』に処理させるのです。 ・つまり、コールバック関数とは『勝手に呼ばれる関数』と思えば分かりやすいです。  これに対して関数を直接呼び出すのは、プログラマーの意思で任意の位置で呼び出します。  プログラマーが呼び出さない限りは関数の『処理』は行いません。 ・よって違いは、Windows などのシステムが内部で呼び出す関数を『コールバック関数』と呼び、  プログラマーさんからしか呼び出す事がない関数を『直接呼ぶ普通の関数』となります。 最後に: ・コールバック関数はたくさんあります。 ・例えば SetTimer() の第4引数の『TIMERPROC』型の『lpTimerFunc』がそれにあたります。  これはセットしたタイマー間隔毎にコールバック関数である『lpTimerFunc』関数を  Windows システムが勝手に呼び出します。もちろん、プログラマーの意思で直接呼び出しても  構いません。→必要に応じて呼び出せばよいのです。 ・『コールバック関数』を内部で呼び出す関数や処理は、必ず最初にセット(登録)しないと  その後に実行されませんので注意して下さい。→セット(登録)などは関数のアドレス(ポインタ)を  引数などに渡すことになります。『コールバック関数』とは『Callback Function』です。  『Call』が呼び出すという意味です。 ・以上。参考に!

参考URL:
http://www7a.biglobe.ne.jp/~lshen/EternalWindows/WinBase/Base/Base06.html
全文を見る
すると、全ての回答が全文表示されます。
回答No.1

「コールバック関数」とは、通常「何かあったときにどこかから呼ばれる関数」という意味になります。コードとしては以下のような感じになります。 直接関数を呼ぶ:  void func();  func(); /* 関数呼び出し */ コールバック関数:  void subscribe(void (*)());  void callback(); /* コールバック関数 */  subscribe(callback); /* コールバック関数の登録。ここではまだ callback() は呼ばれない */  コールバック関数を「誰が」「どのような時に呼び出すか」は、フレームワーク(上の例だと subscribe)の仕様次第なので、何とも言えません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

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

  • コールバックって・・・

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

  • C++別のオブジェクトからメンバ関数をコールバック

    自作のタイマオブジェクトにコールバックしたい別のオブジェクトのメンバ関数(複数)を登録して、一定時間経過後にコールバックしたいです。 今、考えているのはタイマオブジェクトでコールバック関数を呼び出す関数を仮想関数にして、継承したサブクラスごとにどのコールバック関数を呼び出すか処理を変えるやり方です。 ただ、これだと何だか複雑になりそうですし、そもそも根本的なところが間違っている気もします。 ご助言いただきたいです。 よろしくお願いします。

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

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

    • ベストアンサー
    • PHP
  • コールバック関数のメンバ関数化

    コールバック関数のメンバ関数化について質問です。 WindowsAPIでウィンドウプロシージャ(コールバック関数)をクラスのメンバ関数に しようと思っているのですが、出来るのでしょうか? たとえば、 http://wisdom.sakura.ne.jp/system/winapi/win32/win10.html このサイトにある LRESULT CALLBACK WndProc(HWND hWnd , UINT Msg , WPARAM wParam , LPARAM lParam); をクラスのメンバ関数にしたいです。 開発環境 XP C,C++ Visual Studio 2005

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

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

  • コールバック関数

    お世話になります。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=相手のコードの格納アドレス 以上 全体的にどう宣言したら良いのか解りません。 (特にコールバック関数の宣言と、ポインタへの引数の渡し方) すみませんが、御教授お願いします。

  • コールバック関数 再び

    またまた、お世話になります。前回、御回答頂き動作するようにはなったのですが、コールバックに入力があった時に、アプリケーションが終了してしまう現象がおきています。御教授お願いします。 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

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

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

    • ベストアンサー
    • AJAX
  • C言語のコールバック

    Java/C#/PHPといった言語はすでに使えるのですが、現在C言語およびWin32 APIを勉強中です。 C言語の関数にはJavaなどのインスタンスメソッドのthisにあたる引数が渡されませんが、Win32 APIのウィンドウプロシージャに代表されるコールバック関数において不都合があります。Javaの場合は、 interface Callback{ void onCallback(); } といったインターフェイスが定義されているものとして、 hoge(new Callback(){ int data = 10; public void onCallback(){ System.out.println(data); } }); のようなコードで引数以外のデータも参照できますが、C言語ではこのように引数で渡せないデータを参照するにはどうしたらよいでしょうか。グローバル変数として参照するのは、Javaのstaticなフィールドと同様に拡張性を損なうので避けたいと思います。