web-dev-qa-db-ja.com

'{'トークンの前に期待される式

以前にコメントした行の「エラー: '{'トークンの前に期待される式」が表示されます。構造体がすでに定義されている場合、トークンの前に「{」が必要なのはなぜですか。あなたが提供できるあらゆる助けをありがとう。

struct sdram_timing {
    u32 wrdtr;
    u32 clktr;
};

int calibration(void);
unsigned char read_i2c_cal(void);
static unsigned int eepcal[15];

main() {
    DQS_autocalibration();
}

int calibration(void)
{
    struct sdram_timing scan_list[30];

    read_i2c_cal();
    if(eepcal[0] == 0){

       scan_list = {{eepcal[1], eepcal[2]}, {-1, -1}}; // <-- PROBLEM LINE

        }
        else {
            //foo
        }

    return 0;
}

unsigned char read_i2c_cal(void) {
    eepcal[0] = 0;
    eepcal[1] = 02;
    eepcal[2] = 03;
}
9
txcotrader

エラーは配列をそのように割り当てることができないためです。それはそれを初期化するためにのみ機能します。

int arr[4] = {0}; // this works
int arr2[4];

arr2 = {0};// this doesn't and will cause an error

arr2[0] = 0; // that's OK
memset(arr2, 0, 4*sizeof(int)); // that is too

したがって、これを特定の例に適用します。

struct sdram_timing scan_list[30];
scan_list[0].wrdtr = 0;
scan_list[0].clktr = 0;

または、同じ方法でmemsetを使用することもできますが、sizeof(int)の代わりに、構造体のサイズが必要です。それは常にうまくいくとは限らない...しかしあなたの構造を与えられれば、それはうまくいく。

18
Mike

C言語の配列は代入できません。使用する構文に関係なく、配列全体に何も割り当てることはできません。つまり、これ

scan_list = { { eepcal[1], eepcal[2] }, {-1, -1} };

不可能である。

C89/90では、割り当てを行ごとに詳しく説明する必要があります

scan_list[0].wrdtr = eepcal[1];
scan_list[0].clktr = eepcal[2];
scan_list[1].wrdtr = -1;
scan_list[1].clktr = -1;

最近のC(C99以降)では、複合リテラルを使用して構造体全体を割り当てることができます

scan_list[0] = (struct sdram_timing) { eepcal[1], eepcal[2] };
scan_list[1] = (struct sdram_timing) { -1, -1 };

最後に、最近のCでは、memcpyおよび複合リテラルを使用して、データを配列にコピーできます

memcpy(scan_list, (struct sdram_timing[]) { { eepcal[1], eepcal[2] }, {-1, -1} },
  2 * sizeof *scan_list);

最後のバリアントは、あまりエレガントではありませんが、配列割り当てを「エミュレート」する最も近い方法です。

5
AnT

初期化リストは配列の初期化にのみ使用できます。その後は使用できません。

ただし、GCCを使用する場合は、Compound Literal拡張を使用できます。

scan_list = (struct sdram_timing[30]){{eepcal[1], eepcal[2]}, {-1, -1}};

scan_listタイプをstruct sdram_timing *に変更する必要があるかもしれません

1
texasbruce

初期化リストは、変数の宣言でのみ使用できます。事後は使用できません。

1
Jim Buck