12

「エラー:前にコメントした行の「{」トークンの前に式が必要です」というメッセージが表示されます。構造体がすでに定義されている場合、トークンの前に「{」が必要になるのはなぜですか。あなたが提供できるどんな助けにも感謝します。

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;
}
4

4 に答える 4

23

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

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) の代わりに構造体のサイズが必要です。それは常にうまくいくとは限りません...しかし、あなたの構造を考えると、うまくいくでしょう。

于 2012-11-07T18:28:07.647 に答える
6

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

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

不可能です。

C89/90 では、割り当てを 1 行ずつ綴る必要がありました

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);

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

于 2012-11-07T18:37:21.290 に答える
1

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

于 2012-11-07T18:27:52.277 に答える
1

初期化子リストは、配列の初期化にのみ使用できます。それ以降はご利用いただけません。

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

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

scan_listタイプを次のように変更する必要がある場合がありますstruct sdram_timing *

于 2012-11-07T18:31:46.143 に答える