A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
コールバック関数は、「何かしらのフレームワークを作る際に汎用性を高めるため」に使います。
ここで言うフレームワークとは、OSやドライバ、ミドルウェアなど、アプリケーションプログラムが使用する共通モジュールを指します。
これらのフレームワークを設計する際には、個々のアプリケーションが何をするプログラムなのかは分かっていないので、
その関数を実行する手順やタイミングだけ決めておき、実際に何をするかはアプリケーションのプログラマに委ねられます。
前出のウィンドウプロシージャ(WinProc)は、Windowsからイベントを受信した時の処理を、
qsortは渡された配列の並べ替えをする時の大小比較の仕方をアプリケーションプログラマが決められるようにする訳です。
フレームワークの設計者(Windowsの設計者やANSI C言語を考えた人達)は、その仕組みを提供しているだけです。
No.3
- 回答日時:
コールバック関数は、システムや呼び出し先の関数が呼び出し返してくる
アプリケーション定義の関数のことです。
代表的なのは、C標準関数のクイックソートqsort関数の第4引数に渡す
比較用関数ですね。qsortは、並べ替え処理の実行中に、要素の順序を決定
するために、アプリ側が準備している比較用関数を呼び出し返してきます。
Windowsだと、No2の方が示されているウィンドウプロシージャだとか、
「Enum***」系のAPIに渡すアプリ定義の関数が該当します。
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 …
No.1
- 回答日時:
「コールバック関数」とは、通常「何かあったときにどこかから呼ばれる関数」という意味になります。
コードとしては以下のような感じになります。直接関数を呼ぶ:
void func();
func(); /* 関数呼び出し */
コールバック関数:
void subscribe(void (*)());
void callback(); /* コールバック関数 */
subscribe(callback); /* コールバック関数の登録。ここではまだ callback() は呼ばれない */
コールバック関数を「誰が」「どのような時に呼び出すか」は、フレームワーク(上の例だと subscribe)の仕様次第なので、何とも言えません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語について。 3 2022/11/05 20:30
- Excel(エクセル) エクセル関数 3 2022/04/20 11:57
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- C言語・C++・C# プログラム内から、MIDIファイルの一部分だけを再生する方法 1 2023/02/15 11:08
- 工学 制御においてPI制御 P=10/(s+5) c=g+h/sの直接フィードバックを考える。このときrか 4 2023/02/05 13:47
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- Excel(エクセル) Excelで関数を使って入力した値を、関数を抜いた値として扱いたい 1 2022/07/08 02:10
- 数学 『Cの微分.2』 3 2023/02/15 19:47
- 計算機科学 C言語 ラグランジュ補間法 について、 あくまでも多項式による近似なので、各点を直線で結んで滑らかに 2 2022/12/11 01:01
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスの選択ボタ...
-
他のウィンドウのボタンを自動...
-
vbaから他のアプリを終了
-
キーボード・フックのアプリを...
-
MFC利用/WinMainCRTStartup
-
アプリケーション間での操作
-
textboxに文字列を挿入したい。
-
デスクトップ上のアイコンの位...
-
msgboxの表示位置
-
SetWindowText関数について
-
警告メッセージのセキュリティ...
-
メッセージハンドラ
-
VBAでコントロールのハンドルを...
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
グラフの交点の求め方(Excel)
-
フォントの大きさ
-
VBAのフォント変更(エクセルか...
-
コントロールの書式設定で、“コ...
-
メッセージボックスを大きくす...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
メッセージボックスの選択ボタ...
-
他のウィンドウのボタンを自動...
-
msgboxの表示位置
-
VBAでコントロールのハンドルを...
-
デスクトップ上のアイコンの位...
-
メッセージハンドラ
-
SendMessage で ESC など
-
SetWindowText関数について
-
VB.netでFindWindowExやると・...
-
点滅で知らせる方法
-
CloseHandle()
-
SetWindowsHookEx(グローバル...
-
Excel VBA で外部アプリケーシ...
-
VBA 複数セルが空白なら印刷さ...
-
WM_NCLBUTTONUPについて
-
VBでRegisterWindowMessage関数...
-
システム例外のメッセージを変...
-
アプリケーション間での操作
-
マウスホイールをフックしたい
おすすめ情報