ここから本文です

関数テーブルの作り方を教えてください。

sir********さん

2012/8/100:31:59

関数テーブルの作り方を教えてください。

C言語を使って関数テーブルを作りたいのですが作り方が分からず困っています。
知見のある方、どうぞご教授ください。

状態とイベントをみて、実行する関数を割り出すような二次元配列にのテーブルを作りたいです・・

/* 状態 */
enum{
state1 = 0, /*状態1*/
state2, /*状態2*/
state3, /*状態3*/
state_MAX
}

/* イベント */
enum{
evt1 = 0,/*イベント1*/
evt2, /*イベント2*/
evt3, /*イベント3*/
evt_MAX
}

/*funcは実行したい関数です*/

const テーブルの型 テーブル名[状態][イベント]
/* state1 state2 state3*/
/* evt1 */ { NULL, funcA, NULL },
/* evt2 */ { NULL, NULL, funcB },
/* evt3 */ { NULL, NULL, funcB }
}

int funcA(char a){
return;
}

状態2の時にイベント1が来たらfuncAを実行したいのですが、伝わりますでしょうか?
実行関数の戻り値、引数は全て同じです。
関数テーブルの型を何にしたらよいのか、テーブルの書き方もよく理解できておりません。

どなたかよろしくお願い致します。

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
9,132
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

tpo********さん

2012/8/101:10:41

>siromi004

こんな↓感じ?

#include <stdio.h>

enum { state1=0, state2, state3, state_MAX };
enum { evt1=0, evt2, evt3, evt_MAX };


int funcA( char a );
int funcB( char b );

typedef int (*FuncTable)( char );

FuncTable fTable[state_MAX][evt_MAX] = {
{ NULL, NULL, NULL }, /* ← state1 */
{ funcA, NULL, NULL }, /* ← state2 */
{ NULL, funcB, funcB } /* ← state3 */
};


int main()
{
int s, e;
char c;

s = state3;
e = evt2;
c = 3;

if( fTable[s][e] )
fTable[s][e]( c );
else
printf( "関数無し\n" );

return 0;
}


int funcA( char a )
{
printf( "funcA(%d)\n", a );
return 0;
}


int funcB( char b )
{
printf( "funcB(%d)\n", b );
return 0;
}

質問した人からのコメント

2012/8/1 08:54:28

抱きしめる ご回答していただきありがとうございました!!
試してみます!

ベストアンサー以外の回答

1〜1件/1件中

ken********さん

2012/8/100:56:54

関数テーブルの宣言部はこんな感じです。
予め関数は宣言しておいてください。
int (*const fTbl[][3])(char) = {
/* state1 state2 state3*/
/* evt1 */ { func00, func01, func02 },
/* evt2 */ { func10, func11, func12 },
/* evt3 */ { func20, func21, func22 }
};

使い方は例えば↓のような感じ
int state, evt;

for (state = 0; state < 3; state++) {
for (evt = 0; evt < 3; evt++) {
fTbl[state][evt](0);
}
}

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる