7

パラメーターを持たず、int を返す関数へのポインターを保持するサイズ 5 のポインターの配列を初期化したいと考えています (これらの要件を容易にする任意の関数である可能性があります)。

これは私がこれまでに試したことですが、構文エラーが発生します:

int (*func)() fparr[5] = int (*func)();

この構文の何が問題になっていますか?

4

8 に答える 8

16

配列のデフォルトの内容として提供したい関数が呼び出されたfunc場合、

  1. typedef、を使用したほうがよい
  2. 配列初期化子を使用する必要があります

検討:

typedef int (*IntFunc)(void);
IntFunc fparr[5] = { func, func, func, func, func };

または、回避したい場合は、読みにくい方法typedef

int (*fparr[5])(void) = { func, func, func, func, func };
于 2012-12-28T15:00:07.887 に答える
3

実際には関数ポインターの配列を初期化していないため...試してください:

int (*fparr[5])(void) = { func1, func2, func3, func4, func5 };
于 2012-12-28T15:00:29.677 に答える
2

ステップ1:

関数のシグネチャをタイプとして定義しますFN

typedef int (*FN)();

ステップ2:

FN署名を使用して5つの関数を定義します。

int f1(void) { ; }
int f2(void) { ; }
...

ステップ3:

次のタイプの5つの関数の配列を定義して初期化しますFN

FN fparr[5] = {f1,f2,f3,f4,f5}

それ以外の場合

別の署名を定義したくない場合は、前に述べたように、次のように定義できます。

 int ((*)fpar []) () = {f1,f2, ...}

宣言の時点で配列からの関数の数がわかっている場合は、書き込む必要はありません5。宣言と同じ行で配列を初期化すると、コンパイラがこのメモリを割り当てます。

于 2012-12-28T15:02:33.687 に答える
1

うーん、出遅れた…

#include <stdio.h>

int fun0()
{
    return 0;
}

int fun1()
{
    return 1;
}

int fun2()
{
    return 2;
}

int main(int argc, char* argv[])
{
    int (*f[]) (void) = {fun0, fun1, fun2};
    printf("%d\n", f[0]());
    printf("%d\n", f[1]());
    printf("%d\n", f[2]());
    return 0;
}
于 2012-12-28T15:11:14.087 に答える
1

関数ポインターの配列は、デフォルト値を使用して別の方法で初期化できます。


サンプルコード

   
#include <stdio.h>

void add(int index, int a, int b){
    printf("%d. %d + %d = %d\n", index, a, b, a + b);
}
void sub(int index, int a, int b){
    printf("%d. %d - %d = %d\n", index, a, b, a - b);
}
int main(){
    void (*func[10])(int, int, int) = {[0 ... 9] = add};
    func[4] = sub;
    int i;
    for(i = 0; i < 10; i++)func[i](i, i + 10, i + 2);
}
   
上記のプログラムを実行すると、以下の出力が得られます。すべての要素は関数addで初期化されますが、配列の 4 番目の要素は関数subに割り当てられます


出力

0. 10 + 2 = 12
1. 11 + 3 = 14
2. 12 + 4 = 16
3. 13 + 5 = 18
4. 14 - 6 = 8
5. 15 + 7 = 22
6. 16 + 8 = 24
7. 17 + 9 = 26
8. 18 + 10 = 28
9. 19 + 11 = 30

于 2015-01-21T07:34:07.553 に答える
0

正しい構文を示す実際の例を次に示します。

#include <stdio.h>

int test1(void) {
    printf("test1\n");
    return 1;
}

int test2(void) {
    printf("test2\n");
    return 2;
}

int main(int argc, char **argv) {
    int (*fparr[2])(void) = { test1, test2 };

    fparr[0]();
    fparr[1]();

    return 0;
}
于 2012-12-28T15:08:46.770 に答える
0

コード例:

static int foo(void) { return 42; }

int (*bar[5])(void) = { foo, foo, foo, foo, foo };

int (*)()型とは異なる型であることに注意してくださいint (*)(void)。前者は固定されているが指定されていない数の引数を持つ関数を示し、後者は引数のない関数を示します。

また、C 宣言子の構文は、式と同じ規則 (特に演算子の優先順位) に従うため、裏返しに読み取られることに注意してください。

bar関数 ( ) へbar[5]のポインター ( ) の配列 ( ) を示します。後置関数呼び出しは、プレフィックス ポインターの間接化よりも厳密にバインドされるため、括弧が必要です。*bar[5]int (*bar[5])(void)(*bar[5])

于 2012-12-28T15:09:36.700 に答える