2009-07-30 15 views
4

10個の関数ポインタの配列を作成するにはどうすればよいですか?私が持っているのはforループで、各繰り返しで異なる関数に関数ポインタを設定したいのです。そう:抽象関数ポインタ

//pseudocode 
for i (0..10) 
    function = array_of_functions[i]; 
//... 

答えて

8
// Define alias for function pointer type for convenience 
typedef void (*action)(int); 

// Example function 
void print(int) { ... } 

action fs[10] = { print, ... }; 
for (int i = 0; i < 10; ++i) 
{ 
    action f = fs[i]; 

    // Call it somehow 
    f(i * i); 
} 
4

このコード:

return_t (*array_of_functions[10])(arg1_t, arg2_t); 

はそれぞれ指摘-に機能関数ポインタの10要素アレイとして「array_of_functions」型arg1_tとarg2_t戻る型return_tの二つの引数を取りを宣言。タイプを置き換え、必要に応じて引数の数を調整します。

2

最も簡単な方法は、関数のtypedefを作成し、その型の配列を宣言することです。機能のためのtypedefを作成するには:typedef returntype (*typedefname)(argtype1,argtype2,...,argtypeN); EX:

#include <stdio.h> 
#include <stdlib.h> 

typedef void (*functype)(); 

void func1() 
{ 
//... 
} 

void func2() 
{ 
//.. 
} 

//... 


void func10() 
{ 
//... 
} 

int main(int argc, char* argv[]) 
{ 
    functype array[] = 
    { 
     &func1, 
     &func2, 
     &func3, 
     &func4, 
     &func5, 
     &func6, 
     &func7, 
     &func8, 
     &func9, 
     &func10 
    }; 

    // Use the array... 
    return 0; 
} 
2

あなたはそれがのtypedefを使用することをお勧めします醜い関数ポインタ構文に対処する必要が任意の時間。 Tは、各関数の戻り型である

#include <iostream> 

void a(int i) 
{ 
    std::cout<<"a: "<<i<<std::endl; 
} 

void b(int i) 
{ 
    std::cout<<"b: "<<i<<std::endl; 
} 

typedef void (*fn)(int); 

int main(int argc, char**argv) 
{ 

    fn foo[2]; 


    foo[0] = a; 
    foo[1] = b; 


    for(size_t i = 0; i < sizeof(foo)/sizeof(foo[0]); ++i) 
    { 
     foo[i](i); 
    } 

    return 0; 
} 
1
T (*array_of_functions[10])(); 

(すべての機能が自然に、同じ型を返します)。あなたはパラメータの異なる数/タイプを持つ関数へのポインタを格納したい場合は物事はトリッキー取得:

int foo(void) {...} 
int bar(int x) {...} 
int bletch(double y, double z) {...} 
... 
int (*array_of_functions[10])() = {foo, bar, bletch, ...}; 

もしそうなら、あなたはあなたができるように、各機能は、何らかの形で必要とするものの番号とパラメータの種類を追跡する必要がありますそれを正しく呼んでください。

私は実際には、関数ポインタ型のtypedefを利用しています。彼らは単純化するほどあいまいになる傾向があります。

関連する問題