今日は、専攻科の特別研究中間発表のある日で、短縮授業。 時間短いしテキパキやろうと授業に乗り込んだけど、発表準備があるためか、 電子情報の学生さん2人のみ。 このまま授業を進めると、来週復帰してくる学生さんがワケワカメになるので、 講義内容を変更する。
通常、電子情報以外の学科の人には、C言語の基本が知らなかったりするので、 話を省略している、関数ポインタについて紹介する。
関数ポインタ
オブジェクト指向が多用されるGUIなプログラミングでは、マウスが押されたときに動かす処理… といったように、GUIライブラリに自作処理を渡すコールバック関数が多用される。 また、後々のオブジェクト指向の講義で話す、仮想関数の実装でも関数ポインタが使われる。 典型的な使い方は、以下のとおり。
int add( int x , int y ) { return x+y ; } int mul( int x , int y ) { return x*y ; } void main() { int (*f)( int , int ) ; // fは関数へのポインタ。 // (2つのint引数を持ち、intを返す関数) f = add ; printf( "%d" , (*f)( 2 , 3 ) ) ; // 2+3が表示 f = mul ; printf( "%d" , (*f)( 2 , 3 ) ) ; // 2*3が表示
プロセス起動
説明の中で、お二人さんから特別研究に関係するC言語のテクニックとして、質問がでたので 回答する。
(( main は、どう書くのが正しいか? )) int main( int argc , char* argv[] ) { : return 0 ; } // argcはコマンドライン引数の数(プロセス名を含む) // argvはコマンドライン引数の実体 // mainのreturn値は、プロセスの実行結果 // 0:正常終了 // それ以外:異常終了
(( 自分で書いた処理から、gnuplot を起動したい...)) 表示させる処理を書いたscriptを作って、 system( "gnuplot スクリプト" ) ; みたいに呼び出せばいい。ただし、gnuplot の処理が終わるまで、 呼び出し側は処理ができない。呼び出し側で凝った処理をしたい ならば、fork() + exec() で gnuplot を呼び出し、必要に応じて gnuplot とパイプで処理を渡すなどのテクニックを使うべきかも。