No.3
- 回答日時:
基本的には#1さんの回答で十分と思うのですが、メリットがよく分からないという事なので補足します。
たとえば、自分一人でwindowsのように画面にボタンを表示しマウスやキーボードからの入力を受付け、表示したボタンを押下したら別のプログラムが起動するようなプログラムを組むとします。
そうした場合、画面にボタンを表示する処理やマウスの移動などを感知するためハードウェアに近いレベルでのプログラムを組まなければいけません。
それは膨大な量のソースコード量になるでしょう。
それでは時間も勿体無いので、共通出来る部分はシステム側にやってもらうようにします。
●システム側での処理
(1)アプリ側から指定された領域にボタンを表示
(ボタン上でマウスがクリックされた際に呼出すアプリ側の関数を記憶)
(2)ボタン上でマウスがクリックされた際にアプリ側から指定された関数をコール
●アプリ側の処理
(1)指定された領域にボタンを表示するようシステム側に依頼
(ボタン上でマウスがクリックされた際に呼出す関数を同時に指定)
(2)ボタン上でボタンを押下された時に行う処理を記述
こうすると、アプリ側はボタンを表示する依頼をする処理とボタンを押下された時に行う処理のみを記載すれば良い事になります。
結果的にコールバック関数というのは、全体のコード量を減らすことや、共通出来る処理はシステム側にやってもらう事で処理を簡潔にする為に用意されていると思って問題ないと思います。
回答ありがとうございます。
なるほど、おぼろげながら
イメージが掴めてきました。
実際にコールバック関数を作成、利用してみて
理解を深めたいと思います。
他の回答者の方もありがとうございました。
今後もこのカテゴリにて質問すると思いますので、
よろしくお願いいたします。
No.2
- 回答日時:
例えば、qsortやbsearchに渡す比較関数もコールバック関数です。
特定の状況で(上記の例では比較が必要になった場合)、どんな処理を行うのかをあらかじめ決められないような場合に、ユーザー定義の処理方法を渡してもらうテクニックです。
Cの場合は関数へのポインタを渡すのが一般的ですが、C++では関数オブジェクトを渡すほうが一般的です。
なお、コマンドとなる数値や文字列を渡す場合も、基本的な考え方としては同じですが、既存のいくつかのパターンしか対応できないことと、呼び戻しているわけではないので、コールバックという言い方は普通しません。
この回答への補足
回答ありがとうございます。
たとえば……
あらかじめ関数のアドレスを記録したテーブルを
もつ下位関数(呼び出し先)があるとします。
「上位関数(呼び出し元)が、テーブル内の
任意の関数を特定するパラメータを渡して
下位関数を呼びだし、下位関数が受け取ったパラメータ
を使用しテーブル検索を行って、指示された関数を
呼び出す」
という場合にも、下位関数はコールバック関数となるので
しょうか?
No.1ベストアンサー
- 回答日時:
> 意味
関数を呼び出すのではなく、むこうから呼びだしてもらうこと。
> メリット
こちらは「"何が起こったか"はわからないが、そのとき"どうすればいいか"は知っている」
むこうは「"何が起こったか"はわかるが、そのとき"どうすればいいか"はわからない」
とき、「どうすればいいか」をむこうに教えてあげます。
簡単な例:
#include <stdio.h>
typedef int (*callback_t)(int, int);
int execute(callback_t f, int x, int y) {
return (*f)(x,y);
}
int add(int x, int y) {
return x + y;
}
int mul(int x, int y) {
return x * y;
}
int main() {
/* 引数 2, 3 で add を呼び、結果を返せ */
printf("add(2,3) = ", execute(&add,2,3));
/* 引数 2, 3 で mul を呼び、結果を返せ */
printf("add(2,3) = ", execute(&mul,2,3));
}
この回答への補足
回答ありがとうございます。
"上位(呼び出し元)が下位(呼び出し先)に対して
関数のアドレス(関数ポインタ)を渡して、
下位がその関数を呼び出す"
という構造でよろしいでしょうか?
execute関数のように、自分が呼び出している関数が
何なのかを認識せずに、上位関数から指示された
関数を呼びだすというのが、コールバック関数と
いうことでよろしいでしょうか?
メリットがよく分かりませんが、汎用的な関数として
使用できるということでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- その他(メンタルヘルス) 気持ちの切り替えが出来るかのアンケートです。 2 2023/02/02 11:11
- Skype Skype通話について 1 2023/05/24 14:00
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- その他(Microsoft Office) エクセルの関数について 4 2022/07/30 16:42
- Excel(エクセル) Excel 、この式はどのように解釈すればいいのでしょうか 4 2023/02/03 08:53
- 統計学 直線の傾き(回帰係数)から相関係数を計算できるのでしょうか? 2 2022/09/16 19:28
- 経済学 「政府支出乗算」の求め方を教えてください。 2 2022/11/20 19:52
- その他(悩み相談・人生相談) 仕事でわからないことがあるとパニックになり、生きていく自信すらなくしてしまう 3 2022/06/06 21:03
- Visual Basic(VBA) vba Sleep関数について教えてください 1 2023/01/18 10:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DataGridViewのチェックボック...
-
c# 文字列の最後から1文字削除...
-
メッセージボックスのボタンの...
-
マウスのボタン判定について
-
Acrobatのツールボタンの消し方
-
javascript 別ウィンドウを開...
-
TabStripのイベントについて
-
Seasar2環境での画像リンクの作成
-
MEDIAS N-04DのFactoryReset
-
Eclipseでクリーンが出来ない
-
GridViewの項目編集(初歩)
-
SPREADでカーソルの位置を1行目...
-
WEBページ上に[Ctrl]+[F5]を割...
-
最大化ボタンと最小化ボタンを...
-
VBのこのコードの意味を教えて...
-
グリッドビューでのチェックボ...
-
Webブラウザの閉じるボタン無効...
-
VBAで一時中断したプログラムの...
-
ボタンを押したような状態にし...
-
【JavaScript?HTML?】Webペー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c# 文字列の最後から1文字削除...
-
DataGridViewのチェックボック...
-
VBAで一時中断したプログラムの...
-
Eclipseでクリーンが出来ない
-
ブラウザの×ボタン(閉じるボタ...
-
グリッドビューでのチェックボ...
-
メール添付されたPDFファイルが...
-
SPREADでカーソルの位置を1行目...
-
EXCEL2010でセルが編集中かを判...
-
CheckBoxをボタン形式にして押...
-
最大化ボタンと最小化ボタンを...
-
Ctrlキーを押しながらのダブル...
-
IEの閉じるボタンを消す方法
-
今更、VBAでRPA、キーボード操...
-
C# Enterキーの動作について
-
Page_Load時にボタンクリックイ...
-
Webブラウザの閉じるボタン無効...
-
【C#】 : WindowsProgramming ...
-
Fancyboxのiframe内に閉じるボタン
-
VBのこのコードの意味を教えて...
おすすめ情報