ожидается выражение перед '{' маркер

Я получаю: "ошибка: ожидаемое выражение перед" {"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, вы можете использовать