3

関数ポインター配列を作成し、それらを for ループで呼び出せるようにしたいと考えています。どうすればこれを達成できますか?私が試してみました:

void (**a) (int);
a[0] = &my_func1;
a[1] = &my_func2;
a[2] = &my_func3;

for ( i = 0; i < 3; i++){
    a[0]();
    (*a[0])(); // Neither does work
}

しかし、私が推測するいくつかの構文がありません:

error: too few arguments to function ‘*(a + (long unsigned int)((long unsigned int)i * 8ul))’
4

7 に答える 7

7

宣言する関数は、パラメーターとして int を受け取ることが期待されます。

a[0](1);

また、関数のポインターへのポインターを宣言しますが、それらにメモリを割り当てないことに注意してください(これは例にあるだけだと思います)。それ以外の場合は、おそらく次のようになります。

void (*a[3]) (int);
于 2012-05-19T15:00:33.087 に答える
3

aをパラメータとして受け取る関数へのポインタ (またはポインタの配列) へのポインタであることを宣言しているintため、関数を呼び出すときに int を渡す必要がありますa[0](42);

于 2012-05-19T15:00:21.997 に答える
2

以下のコードが必要だと思います。

typedef void * func_pointer(int);

func_pointer fparr[10];

for(int i = 0; i<10; i++)
{
     fparr[i](arg); //pass the integer argument here
}
于 2012-05-19T15:01:47.887 に答える
1

関数に引数を与えるのを忘れました。

void (**a) (int); // here it takes an int argument
a[0] = &my_func1;
a[1] = &my_func2;
a[2] = &my_func3;

for ( i = 0; i < 3; i++){
    a[0](); // here you do not give an argument
}

aただし、配列にメモリを割り当てないと、nice セグメンテーション違反エラーで失敗することに注意してください。

void my_func1(int i) {
    ;
}
void my_func2(int i) {
    ;
}
void my_func3(int i) {
    ;
}

int main() {
    void (**a) (int);
    a = malloc(3*sizeof(void*)); // allocate array !
    a[0] = &my_func1;
    a[1] = &my_func2;
    a[2] = &my_func3;

    for (int i = 0; i < 3; i++){
        a[i](1); // respect your own function signature
    }
    free(a); // it's always a good habit to free the memory you take
    return 0;
}
于 2012-05-19T15:05:21.893 に答える
1

関数配列を必要なサイズで定義し、次のような関数で初期化できます。

void my_func1(int x){}
void my_func2(int x){}
void my_func3(int x){}

void (*a[])(int)={my_func1,my_func2,my_func3};


int i;
for(i=0;i<sizeof a/sizeof*a;++i)
  a[i](i);

関数名の前のアドレス演算子「&」は冗長です。

于 2012-05-19T15:19:59.210 に答える
1

1) 関数アドレスを格納するための配列をどこに割り当てまたは定義しましたか?

2) 常に (*a[0])(); を呼び出しているループ内では、ループ カウンターが必要です。

于 2012-05-19T15:01:05.437 に答える
1

あなたはtypedef void (*pfun)(int);pfun a[3];あなたが望む配列であることができます。

次のコードはあなたのために働くかもしれません:

typedef void (*pfun)(int);

int main() {
    pfun a[3];
    a[0] = myfunc1;    // or &myfunc1 whatever you like
    a[1] = myfunc2;
    a[2] = myfunc3;
}
于 2012-05-19T15:03:00.983 に答える