ホーム » スタッフ » 斉藤徹 » 関数ポインタやプロセス起動

2010年4月
« 3月   5月 »
 123
45678910
11121314151617
18192021222324
252627282930  

最近の投稿(電子情報)

アーカイブ

カテゴリー

関数ポインタやプロセス起動

今日は、専攻科の特別研究中間発表のある日で、短縮授業。 時間短いしテキパキやろうと授業に乗り込んだけど、発表準備があるためか、 電子情報の学生さん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 とパイプで処理を渡すなどのテクニックを使うべきかも。