2017年7月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

Amazonウィジェット

  • miniPC
  • 最近買った本
  • Raspberry Pi
  • クアッドコプター
  • 書籍ランキング

AdSense

  • 広告
無料ブログはココログ

« C言語 sscanfの続きとvsscanfとの違い。それぞれの使いどころ | トップページ | Python lsコマンドからファイルのリストを受け取るやりかた »

2016年10月23日 (日)

C言語 関数ポインタを使って遊ぶ

可変長引数を使うと、いくらでも引数を渡せるということがわかったので、それを使って関数ポインタを渡したらどうなるかやってみました。まずは関数ポインタというのがどんな風に使われるかの基本をおさらいしてから、この記事の本題に移っていきます。




まず、九九の表を作れといわれたとする。これから何が起こるのか知らされもせず。

#include 

int mult(int a, int b){        return a*b; } void dispCalc(void){        for (int i = 0; i < 10; i++){               for (int j = 0; j < 10; j++){                      int res = mult(i, j);                      printf("%3d,", res);               }               puts("");        } } void main(void){        dispCalc();        getchar(); }

じゃあ足し算の表は?となったとき、mult関数とは別にdispCalcAddでも作ればよいのだが、 もっと良い方法に、計算方法を書いた関数へのポインタを渡すというのがある。

#include 

int mult(int a, int b){        return a*b; } int add(int a, int b){        return a+b; } void dispCalc(int (*func)(int,int)){        for (int i = 0; i < 10; i++){               for (int j = 0; j < 10; j++){                      int res = func(i, j);                      printf("%3d,", res);               }               puts("");        } } void main(void){        dispCalc(mult);        dispCalc(add);        getchar(); }


ここまでが関数ポインタの概要。同じ機能を実現する関数は、振る舞いに応じて別々に関数を作らなくても、どのような振る舞いをするかを関数ポインタで渡してやればよいということ。

ここからが本題。じゃあ九九の表と足し算の表のあと、もう一回九九の表を書け。とか、ファイルに何の表をどの順番で書くか指示が書いてあるからその順番で書けとか、もうむちゃくちゃ色々な指示が出たらどうするか。そこで可変長引数を使ってみたら、

#include 

#include

//計算をする関数のポインタをtypedefする typedef int(*calc)(int, int); int mult(int a, int b){        return a*b; } int add(int a, int b){        return a + b; } void execList(int n,int a,int b, ...){        va_list argv;        va_start(argv, b);        for (int i = 0; i < n; i++){               calc pnt = va_arg(argv, calc);               int result = (pnt)(a, b);               printf("res %d\n", result);        }        va_end(argv); } void main(void){        //掛け算、足し算、掛け算        execList(3, 5, 2, mult, add, mult);        getchar(); }


関数のポインタをtypedefしておくと少しでも見やすくなる。また型チェックで警告も出してもらえるかもしれない。


ゲームのキャラクターの振る舞いをセットしたり、いろんなログを決まった順番で加工したり。色々使えそうだ。

« C言語 sscanfの続きとvsscanfとの違い。それぞれの使いどころ | トップページ | Python lsコマンドからファイルのリストを受け取るやりかた »

C言語」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/518723/64289544

この記事へのトラックバック一覧です: C言語 関数ポインタを使って遊ぶ:

« C言語 sscanfの続きとvsscanfとの違い。それぞれの使いどころ | トップページ | Python lsコマンドからファイルのリストを受け取るやりかた »