Почему я не могу инициализировать массив во вложенной структуре? - PullRequest
3 голосов
/ 05 апреля 2019

Я хочу создать новую структуру, которая является комбинацией двух идентичных структур. Каждая из этих подструктур включает в себя один скалярный двойник и трехмерный массив. Однако, когда я пытаюсь инициализировать структуру, я получаю ошибки, когда пытаюсь дать массиву его значения.

У меня нет ошибок компиляции, но когда я пытаюсь посмотреть значения массива во вложенной структуре, я вижу совершенно неверные безумные числа.

Вы знаете, что я здесь делаю не так?

typedef struct quackStruct {
    double s;
    double v[3];
} quackStruct;

typedef struct dualquackStruct {
    quackStruct q1;
    quackStruct q2;
} dualquackStruct;

int main() {
    quackStruct duck1 = { .s = 0.0, .v = { 0.5,4.0,2.1 } };
    quackStruct duck2 = { .s = 0.85, .v = { 20.0, 10.0, -5.0 } };

    /* I tried this... but it didn't work
    dualquackStruct ducks = { duck1, duck2 }; */

    /* this didn't work either */
    dualquackStruct ducks = { .q1.s = 0.0, .q1.v = { 0.5, 4.0, 2.1 },
                              .q2.s = 0.85, .q2.v = { 20.0, 10.0, -5.0 } };

    printf("%f\n", ducks.q1.s);
    printf("%f\n", ducks.q1.v[0]);
    printf("%f\n", ducks.q1.v[1]);
    printf("%f\n", ducks.q1.v[2]);
    printf("%f\n", ducks.q2.s);
    printf("%f\n", ducks.q2.v[0]);
    printf("%f\n", ducks.q2.v[1]);
    printf("%f\n", ducks.q2.v[2]);

    return 0;
}

1 Ответ

4 голосов
/ 05 апреля 2019

Ваша первая строка компилируется.Но - вы не можете определить одну и ту же переменную дважды ...

Во второй строке вам нужно выполнить вложенную инициализацию структуры q1 и q2 в фигурных скобках, а не переходить на два уровня вниз с помощью.firstlevelfield.secondlevelfield.:

dualquackStruct ducks = { .q1 = { .s = 0.0,  .v = { 0.5,  4.0,  2.1} },
                          .q2 = { .s = 0.85, .v = {20.0, 10.0, -5.0} } };

См. обе строки (после исправления) компиляции (GodBoot).

...