2

Cで配列を初期化しようとして奇妙なエラーが発生しました - 誰でもこれが起こる理由を知っていますか?

私はグローバル変数を持っています:

static my_type foo[6];

インクルードされたヘッダーファイルには、次のものがあります。

typedef uint32_t my_type[5];

次に、グローバル変数と同じファイル内の関数で次のことを試みます。

foo = {{1, 2, 3, 4, 5}, {1, 2, 3, 4, 6}, {1, 2, 3, 4, 7}, {1, 2, 3, 4, 8}, {1, 2, 3, 4, 9}, {1, 2, 3, 4, 10}};

コンパイラ (GCC4) は、「'{' トークンの前に式が必要です」というエラーを返します。

何が間違っていて、それを修正する方法を知っている人はいますか?

乾杯!

4

2 に答える 2

4

それは初期化ではなく、代入です。初期化は単一のステートメントでなければなりません:

static my_type foo[6] = {{1, 2, 3, 4, 5},
                         {1, 2, 3, 4, 6},
                         {1, 2, 3, 4, 7},
                         {1, 2, 3, 4, 8},
                         {1, 2, 3, 4, 9},
                         {1, 2, 3, 4, 10}};

この構文を使用して C89 の配列全体に代入することはできません。あなたができることはmemcpyからconstです:

void initialize_foo()
{
    static const my_type init[6] =
                        {{1, 2, 3, 4, 5},
                         {1, 2, 3, 4, 6},
                         {1, 2, 3, 4, 7},
                         {1, 2, 3, 4, 8},
                         {1, 2, 3, 4, 9},
                         {1, 2, 3, 4, 10}};
    assert(sizeof(foo) == sizeof(init));
    memcpy(foo, init, sizeof(foo));
}
于 2013-10-29T10:37:29.030 に答える
4

C99 未満の場合:

ISO C99 は、複合リテラルをサポートしています。複合リテラルは、初期化子を含むキャストのように見えます。その値は、初期化子で指定された要素を含む、キャストで指定された型のオブジェクトです。それは左辺値です。拡張機能として、GCC は C89 モードと C++ で複合リテラルをサポートします。

しかしfoo、ポインタでなければなりません

#include <stdio.h>
#include <stdint.h>

typedef uint32_t my_type[5];

int main(void)
{
    int i, j;
    my_type *foo;

    foo = ((my_type[]) {
      {1, 2, 3, 4, 5},
      {1, 2, 3, 4, 6},
      {1, 2, 3, 4, 7},
      {1, 2, 3, 4, 8},
      {1, 2, 3, 4, 9},
      {1, 2, 3, 4, 10}
    });
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 5; j++) {
            printf("%d ", foo[i][j]);
        }
        printf("\n");
    }
    return 0;
}
于 2013-10-29T10:46:39.390 に答える