<<前 [TOP]
Visual Studioで新規プロジェクトを作り、以下のヘッダーファイルと2つのcppファイルを作成して下さい。
【Draw.h】
/** ヘッダファイル */ /**Draw.h*/ void draw(int max_x, int max_y, int (*func)(int)); #ifdef MAIN int max_x; int max_y; #else extern int max_x; extern int max_y; #endif
【Draw.cpp】
/** 描画モジュール */ /**Draw.cpp*/ #include<iostream> void draw(int max_x, int max_y, int (*func)(int)){ int x; int y; int arr_x[30]; int arr_y[30]; /**配列にx,yの値を格納*/ for(int j=0; j<max_x; j++){ x=j; y=func(x); arr_x[j]=x; arr_y[j]=y; } std::cout << "^"<< std::endl; for(int i=max_y; i>0; i--){ std::cout <<"|"; if(arr_y[i]>=0 && arr_y[i]<max_y){ for(int j=0; j< arr_x[i]; j++) { std::cout << " "; } std::cout << "*"; } std::cout << std::endl; for(int k=0; k<arr_x[i]; k++){ if(arr_y[i]>=0 && arr_y[i]<max_y){ std::cout <<"|"<< std::endl; } } } std::cout <<"+"; for(int l=0; l<max_x; l++){ std::cout <<"--"; } std::cout << ">" << std::endl; }
【Draw_main.cpp】
/** mainモジュール */ /**Draw_main.cpp*/ #include<iostream> #define MAIN #include "draw.h" int func(int x); int main(){ max_x=30; max_y=10; draw(max_x, max_y, func); } int func(int x){ return ((x*x)-2*x+1); }
画面に点を表示するライブラリが「[tionToProgramming:Draw.cpp]」で、これを呼び出すプログラムが「[Draw_main.cpp]」」です。
ライブラリ側ではどのような関数が渡されているかはわかりません。
関数func()をの関数式を書き換えれば違う点を描画します。
draw()関数は描画するx, y方向の広さと描画する関数のアドレスを渡しています。
draw()内部ではx=0からx=29までfunx(x)を呼び出し、それがy=0からy=9までに入っていれば配列にその位置を記憶させてループで回し、最後に出力して終了しています。
関数ポインタは関数と同じように利用できます。
引数と返り値を持っています。
C言語の内部では関数名自体が関数へのアドレスそのものとなります。
関数ポインタの宣言は以下のようにします。
関数ポインタの宣言
変数の型 (* 関数名) ();
例 int (* pfunc)();
関数ポインタの使用方法は簡単です。
関数ポインタに関数のアドレスを代入し、後は普通の関数のように利用します。
関数のアドレスは関数の名前がアドレスとなっていますのでこれを代入するようにします。
int test(void); int (*pf)(); pf = test; pf(); /* 呼び出し */
ここで「pf=test();」と書くと全く違う意味になるので注意が必要です。
関数ポインタの主な使い方は関数の引数に関数のアドレスを渡して関数ポインタで受け取る場合などです。
int test2( int (*pf)() ){ return pf() * pf(); }
この例ではtest2()に関数を渡すことにより関数test2()の中でそれらの関数を利用することが出来ます。
実行結果を確認してください。
↓↓クリックして頂けると励みになります。