以前にコメントした行の「エラー: '{'トークンの前に期待される式」が表示されます。構造体がすでに定義されている場合、トークンの前に「{」が必要なのはなぜですか。あなたが提供できるあらゆる助けをありがとう。
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;
}
エラーは配列をそのように割り当てることができないためです。それはそれを初期化するためにのみ機能します。
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)の代わりに、構造体のサイズが必要です。それは常にうまくいくとは限らない...しかしあなたの構造を与えられれば、それはうまくいく。
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);
最後のバリアントは、あまりエレガントではありませんが、配列割り当てを「エミュレート」する最も近い方法です。
初期化リストは配列の初期化にのみ使用できます。その後は使用できません。
ただし、GCC
を使用する場合は、Compound Literal
拡張を使用できます。
scan_list = (struct sdram_timing[30]){{eepcal[1], eepcal[2]}, {-1, -1}};
scan_list
タイプをstruct sdram_timing *
に変更する必要があるかもしれません
初期化リストは、変数の宣言でのみ使用できます。事後は使用できません。