2

ときどき、関数のアドレスを C のパラメーターとして渡すのはなぜですか? 関数を直接使用しないのはなぜですか? BSTのADTを使用しているときにそのようなコードに出くわしました

4

4 に答える 4

1

ポリモーフィズムのように動作を変えるために、さまざまな関数を渡すことができますが、仮想メソッドやその他のトリックを持つクラスは必要ありません。

于 2013-07-19T12:41:57.857 に答える
0

関数ポインターの利点:

  • 関数ポインターは、何かを行う方法に関する命令を渡す方法を提供します
  • 関数ポインタを引数として渡すことで、プログラマが動作を選択できる柔軟な関数とライブラリを作成できます。
  • この柔軟性は、仮想関数を持つクラスを使用することによっても実現できます。

( cprogramming.comより)

于 2013-07-19T12:42:38.163 に答える
0

この質問への答えには、おそらく関数ポインターの使用/利点についての説明が必要です。

ケース 1: ノンブロッキング API :

目的は、ファイルのネットワーク ダウンロードを実行し、呼び出し元に出力バッファーを提供する汎用モジュールを開発することだとしましょう。この目的のためには、次のように非ブロッキング API をアプリケーションに提供することがより理にかなっています。

/* Prototype of the download callback passed as argument */
  typedef int (*app_download_cbk)(char *out_buffer, unsigned int ui_buffer_length);

/* Asynchronous API to download a file */
  int download_file(const char *URI, app_dwnload_callbask app_cbk);

この場合、アプリケーションは APIdownload_fileを呼び出して独自の操作を実行できます。ダウンロードが完了するたびに、モジュールは、API 呼び出し中に登録したコールバックを介してアプリケーションに通知します。download_file

ケース 2: モジュールの汎用実装

目的は、データベースのクエリを実行し、データをアプリケーションに提供する汎用モジュールを開発することだとしましょう。この場合、必要なことは何でも行うかどうかはアプリケーション次第です。したがって、関数ポインターを受け入れる API を設計できます。したがって、モジュールはコールバックを介してクエリ結果を渡すことができ、アプリケーションは必要に応じてこれらの結果を処理できます。

于 2013-07-19T13:08:25.903 に答える
0

別の関数へのポインターを引数として取得する関数は、引数関数をコールバックして、繰り返し操作を実行できます。したがって、名前のコールバック関数。コールバックの実装を切り替えると別のことができるため、関数はより普遍的になります。たとえば、ボタンのクリックなど、ウィンドウが処理するメッセージがあるときに呼び出されるコールバック関数を登録するときに、Windows GUI プログラミングで使用されます。

于 2013-07-19T12:47:13.380 に答える