Cでのコールバック関数
こんにちは、将来のプログラマーたち!今日は、C言語におけるコールバック関数の fascinante な世界に飛び込みます。あなたの近所の親切なコンピュータサイエンスの先生として、この概念をガイドするのがとても楽しみです。信じてください、コールバックを理解すると、プログラミングにおける新しいスーパーパワーを解錠したような気になります!
コールバック関数とは?
まず基本から始めましょう。ピザパーティ(だれもが大好きなものですよね?)で、ピザが到着したらあなたに電話してくれる友達に頼むとします。あなたの友達は、特定のイベントが発生したときにあなたを呼び戻すことで、事実上コールバックを行っています。
C言語のプログラミングでは、コールバック関数も同様に働きます。コールバック関数は、他の関数に引数として渡される関数です。この他の関数は、特定のイベントが発生したりタスクが完了したりしたときに、渡された関数を「呼び戻します」(実行します)。
以下はコールバック関数のシンプルな構造です:
void callback_function() {
// 関数本体
}
void main_function(void (*callback)()) {
// いくつかのコード
callback(); // コールバック関数を呼び出す
// もっとコード
}
int main() {
main_function(callback_function);
return 0;
}
この例では、callback_function
が私たちのコールバックです。それを main_function
に渡し、その中でどこかで呼び出します。
Cにおけるコールバック関数の例
もう少し具体的な例を見てみましょう。計算が完了した後にメッセージを表示するシンプルなプログラムを作成します。
#include <stdio.h>
// 私たちのコールバック関数
void print_result(int result) {
printf("結果は: %d\n", result);
}
// 計算を行いコールバックを呼び出す関数
void perform_operation(int a, int b, void (*callback)(int)) {
int sum = a + b;
callback(sum); // コールバック関数に結果を渡す
}
int main() {
perform_operation(5, 3, print_result);
return 0;
}
この例では:
-
print_result
というコールバック関数を定義し、整数を受け取り表示します。 -
perform_operation
関数は、2つの整数と関数ポインタを引数として受け取ります。 -
perform_operation
内で合計を計算し、その合計をコールバック関数に渡します。 -
main
でperform_operation
を呼び、数字とprint_result
コールバックを渡します。
このプログラムを実行すると、出力は "結果は: 8" となります。
コールバック関数と引数
コールバックは複数の引数も取ることができます。前の例を拡張して、更多信息を表示するようにします:
#include <stdio.h>
// 複数の引数を持つコールバック関数
void print_operation(char operation, int a, int b, int result) {
printf("%d %c %d = %d\n", a, operation, b, result);
}
// 計算を行いコールバックを呼び出す関数
void perform_operation(int a, int b, char op, void (*callback)(char, int, int, int)) {
int result;
switch(op) {
case '+': result = a + b; break;
case '-': result = a - b; break;
case '*': result = a * b; break;
case '/': result = a / b; break;
default: printf("無効な操作\n"); return;
}
callback(op, a, b, result);
}
int main() {
perform_operation(5, 3, '+', print_operation);
perform_operation(10, 4, '-', print_operation);
perform_operation(7, 2, '*', print_operation);
perform_operation(20, 5, '/', print_operation);
return 0;
}
このプログラムの出力は以下の通りです:
5 + 3 = 8
10 - 4 = 6
7 * 2 = 14
20 / 5 = 4
ここで、私たちのコールバック print_operation
は4つの引数を受け取り、操作、2つの操作数、そして結果を表示します。これにより、より柔軟で情報豊かな出力を作成できます。
Cにおけるコールバックの種類
Cでは、コールバックを以下の2つの主要なタイプに分類できます:
-
同期的コールバック:即座に渡された関数を実行します。前述の例はすべて同期的コールバックです。
-
非同期的コールバック:後で実行されることが多く、イベント駆動型のプログラミングやI/O操作で使用されます。
以下にこれらのタイプをまとめた表を示します:
タイプ | 説明 | 使用例 | 例 |
---|---|---|---|
同期的 | 即座に実行 | シンプルな操作、計算 | 私たちの算術操作の例 |
非同期的 | 後で実行 | イベントハンドリング、I/O操作 | ファイル読み書きのコールバック、GUIイベントハンドラー |
以下は非同期的コールバックのシンプルな例です:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void callback_function(int signum) {
printf("シグナル %d を受信しました\n", signum);
}
int main() {
signal(SIGALRM, callback_function);
alarm(5); // 5秒後のアラームを設定
printf("アラームを待っています...\n");
pause(); // シグナルを待つ
return 0;
}
この例では、callback_function
は非同期的コールバックとして設定され、SIGALRMシグナルを受け取ると呼び出されます。alarm(5)
は5秒後のアラームを設定し、pause()
はシグナルを待ちます。
そして、あなた達各位!C言語のコールバック関数の世界を旅しました。コールバックは、あなたのプログラミング冒険における信頼のパートナーです。必要なときにいつもそばにいます。練習を続け、間もなくコールバックをプロのように扱えるようになるでしょう!
Credits: Image by storyset