2016-10-16 12 views
0

関数ポインタを特定の数値に保存するには、コンテナが必要です。 Like関数ポインタを保存するコンテナ

1 = function add 
2 = function sub 
3 = function mult 

など。これは単純な割り込みハンドラのためのもので、割り込み番号に応じて特定の関数を呼び出す必要があります。 私は構造化リストでこれを行うことができると思っていましたが、最大限のエントリのサイズを知っています。だから、私は文字列の配列について考えた

const char *functions[2]; 
a[0] = "add"; 
a[1] = "sub"; 

しかし、私はどのように私はさらに文字列を使用することができません。 ヒントや考えがありますか?

ありがとうございます!

編集:明確にするために、ここでは2つの重要な機能があります.1つは、関数ポインタを数値と共にいくつかのコンテナに保存することです。もう1つは、「そのコンテナ内の特定の番号にある関数に移動してください」ということだけです。したがって、最初の関数はint型の数値(たとえば1から50)と関数へのポインタを取得します。それらは一緒に救われるべきです。 2番目の関数は、単にパラメータとしてint型の数値を取得し、それから私のコンテナ内のint型の数値に関連付けられた関数を呼び出す必要があります。私が何を求めているかは、関数を指し示すポインタを数値と共に保存する方法です。

EDIT2:関数ポインタを保存します。私は多分関数名を文字列として保存し、後で別の方法を知らなかったので後で関数名として使うことができると思った。

+0

あなたがしていることが分かっているかのように尋ねています。あなたの質問は非常に不明です。 –

+0

文字列や関数ポインタを保存しますか?あなたが今私たちに示したことは、前者です。後者を望む場合は、引用符を取り除き、それに従って '関数 'のタイプを調整してください。 – CompuChip

+0

ご迷惑をおかけして申し訳ありません、私は私の質問を編集しました。 –

答えて

1

あなたはこのようにそれを行うことができます。

// the functions you want to point to 
int add(int a, int b) { do stuff } 
int sub(int a, int b) { do some other stuff } 

... 

// declare and set a function pointer 
int (*myFuncPtr) (int, int); 
myFuncPtr = ⊂ // points to the function "sub". The & is optional 

// now use it: 
int result = myFuncPtr(23, 42); 

関数ポインタの型は戻り値に依存し、関数のパラメータは、あなたが指すようにしたいです。今

typedef int (*funcPtr) (int, int); 

宣言し、このようなtypedefを使って関数ポインタを初期化します:

あなたは 簡単にtypedefを使って関数ポインタ変数の宣言を行うことができます。もちろん、

funcPtr myFuncPtr = &add; 

をおこれらのポインタの多くを配列 に配置し、インデックスでアクセスできます:

funcPtr funcPtrs[] = { &sub, add }; // like i said, the ampersand is optional 
int result = funcPtrs[0](23, 42); 
1

関数ポインタを格納する必要があるため、新しい関数ポインタ型を定義して配列を作成する必要があります。今、あなたはoperation_tの配列を作成することができます

typedef int (*operation_t)(int,int); 

:あなたの質問によると、すべての機能が2つのintのパラメータを取り、戻ってintので、新しいタイプは次のようなものでなければならなければなりません。全体コード:

#include <stdio.h> 

typedef int (*operation_t)(int,int); 

int addInt(int n, int m) { 
    return n+m; 
} 

int subInt(int n, int m) { 
    return n-m; 
} 

int multipleInt(int n, int m) { 
    return n*m; 
} 

int main() 
{ 
    const operation_t function_list[3] = {&addInt, &subInt, &multipleInt}; 
    int i; 

    for(i = 0; i < 3; i++) 
    { 
     printf("inputs: 2 and 3 result: %d\n", function_list[i](2,3)); 
    } 
    return 0; 
} 

出力:

enter image description here

なお、それはインデックスが0, 1, 2ている配列のように。


あなたが関数ポインタとint IDでstuctを作成することができます独自のIDを追加します。

typedef struct operation 
{ 
    int (*operation_p)(int,int); 
    int id; 
} math_operation_t; 

さらに、次の要素へのポインタである3番目のメンバ変数を定義すると、動的に関数を追加することもできます。あなたが保存して関数ポインタを使用したい場合は

関連する問題