ожидается выражение перед '{' маркер
Я получаю: "ошибка: ожидаемое выражение перед" {"token" для строки, которую я прокомментировал раньше. Если структура уже определена, зачем ей нужен маркер " {"before. Спасибо за любую помощь вы можете предоставить.
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 ответов
ошибка заключается в том, что вы не можете назначить массив таким образом, это работает только для его инициализации.
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 (post-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
, вы можете использовать