инициализация вложенного массива структуры - PullRequest
2 голосов
/ 20 сентября 2011

Я пытаюсь инициализировать массив вложенных структур.

Вот что я делаю:

// init a nested struct
struct L1 {
    struct L2 {
        int i[4];
    } l2[3];
};

L1::L2 l2 = {1,2,3,4};

L1::L2 l2_a[] = { {1,2,3}, {1,2}, {1,2,3,4}};

L1 l1 = {
    {{1,2,3}, {1,2}, {1,2,3,4}}
};

L1 l1_a0 = {};
L1 l1_a1 = {0};

L1 l1_a[] = {
    {{1,2,3}, {1,2}, {1,2,3,4}},
    {{1,2,3}, {1,2}, {1,2,3,4}}
}; // ... error: too many initializers for 'L1'

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

Можно ли это сделать вообще? Вот соответствующий пост об инициализации вложенных структур. Кстати, я использую g ++.

Ответы [ 2 ]

4 голосов
/ 20 сентября 2011

Да, вы можете: еще одна причина всегда компилировать -Wall, так как компилятор может дать вам такие полезные предупреждения, как:

предупреждение: пропущены скобки вокруг инициализатора для for L1 :: L2 [3] ’

Чистый результат не очень хорош, но в итоге вы тратите меньше деревьев на печатную копию телетайпа вывода компилятора:

Смотрите в прямом эфире здесь: http://ideone.com/YKq3d

struct L1 {
    struct L2 {
        int i[4];
    } l2[3];
};

L1::L2 l2 = { {1,2,3,4} };

L1::L2 l2_a[] = { {{1,2,3}}, {{1,2}}, {{1,2,3,4}}};

L1 l1 = {
    {{{1,2,3}}, {{1,2}}, {{1,2,3,4}}}
};

L1 l1_a0 =  {};
L1 l1_a1 = {{{{0}}}};

L1 l1_a[] = {
    {{{{1,2,3}}, {{1,2}}, {{1,2,3,4}}}},
    {{{{1,2,3}}, {{1,2}}, {{1,2,3,4}}}} 
}; // ... sweet potatoes!


int main()
{
    return 0;
}
0 голосов
/ 20 сентября 2011
L1 l1_a[] = {  // l1_a
  { // l1_a[0]
    { // l1_a[0].l2
      { // l1_a[0].l2[0]
        {1,2,3,4} // l1_a[0].l2[0].i
      },
      {
        {1,2,3,4}
      },
      {
        {1,2,3,4}
      }
    }
  },
  {
    {
      {
        {1,2,3,4}
      },
      {
        {1,2,3,4}
      },
      {
        {1,2,3,4}
      }
    }
  },
  {
    {
      {
        {1,2,3,4}
      },
      {
        {1,2,3,4}
      },
      {
        {1,2,3,4}
      }
    }
  },
};
...