Назначение массива структуры - PullRequest
2 голосов
/ 18 декабря 2011
    extern struct aStruct aStruct_table[4];

int main()
{
        aStruct_table[0].val1 = 0;
        aStruct_table[0].val2 = 0x0;
        aStruct_table[0].val3 = 0x130;
        aStruct_table[1].val1 = 1;
        aStruct_table[1].val2 = 0x140;
        aStruct_table[1].val3 = 0x860;
        aStruct_table[1].val1 = 4;
        aStruct_table[1].val2 = 0x2050;
        aStruct_table[1].val3 = 0x1950;
        aStruct_table[1].val1 = 7;
        aStruct_table[1].val2 = 0x6000;
        aStruct_table[1].val3 = 0x666;
}

Есть ли другой способ присвоения массива struct без большого количества кода? Может быть, что-то вроде

    extern struct aStruct aStruct_table[4] = {{0,0x0,0x130},
                                             {1,0x140,0x860},
                                             {4,0x2050,0x1950},
                                             {7,0x6000,0x666}};

Ответы [ 2 ]

4 голосов
/ 18 декабря 2011

Я полагаю, вы смешиваете присваивание и инициализацию.

В современном C, AKA C99, лучший способ инициализации struct - это "назначенные инициализаторы"

struct aStruct A = { .val1 = 0, .val2 = 0x0A };

и синтаксис для массивов структур просто повторяет это:

struct aStruct B[] = {
   { .val1 = 0, .val2 = 0x0A },
   { .val1 = 2, .val2 = 0x0B }
};

Но вы не должны делать это с extern впереди.Это для прямого объявления в заголовочном файле без части инициализации.

Если вы действительно имели в виду присвоение, для struct вы можете использовать «составные литералы

A = (struct aStruct){ .val1 = 0, .val2 = 0x0A };

, но вывероятно, известно, что для массивов нет синтаксиса присваивания.

3 голосов
/ 18 декабря 2011

Да, это совершенно законно.

С инициализаторами C99 это может быть еще яснее:

extern struct aStruct aStruct_table[4] = {
    [0] = {
        .val1 = 0,
        .val2 = 0x0,
    },
    [1] = {
// etc etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...