C ++ инициализация массива структуры - PullRequest
3 голосов
/ 22 марта 2012

Это нормально:

int vec_1[3] = {1,2,3};

так что не так с

struct arrays{
  int x[3];
  int y[3];
  int z[3];
};
arrays vec_2;
vec_2.x = {1,2,3};

что дает
ошибка: невозможно преобразовать <заключенный в скобки список инициализаторов> в «int» в назначении

Я прочитал много сообщений об этой ошибке, но до сих пор не ясно, в чем проблема.

Ответы [ 5 ]

5 голосов
/ 22 марта 2012

Первая инициализация. Вторая попытка присваивания, но массивы не присваиваются.

Вы можете сделать что-то вроде:

arrays vec_2 = {{1,2,3}, {3,4,5}, {4,5,6}};

Если вы хотите инициализировать только vec_2.x, вы можете просто пропустить остальные инициализаторы:

 arrays vec_2 = {1,2,3};

В этом случае остаток vec_2 будет инициализирован, чтобы содержать нули.

Хотя вам нужно включить хотя бы один набор скобок вокруг инициализаторов, вам не нужно включать «внутренние», если вы этого не хотите. Включение их может дать вам дополнительную гибкость. Например, если вы хотите инициализировать первые два элемента в vec_2.x и первый в vec_2.y, вы можете использовать:

arrays vec_2 = {{1,2}, {3}};

В этом случае вы получите vec_2, установленный так, как если бы вы использовали {1, 2, 0, 3, 0, 0, 0, 0, 0}; в качестве инициализатора.

3 голосов
/ 22 марта 2012

Это присвоение, а не инициализация:

arrays vec_2;
vec_2.x = {1,2,3}; 

Используйте следующее, что эквивалентно тому, что вы пытались:

arrays vec_2 = { {1, 2, 3 } };

Если вы хотите указать значения для y и z также:

arrays vec_2 = { {1,2,3}, // x
                 {4,5,6}, // y
                 {7,8,9}  // z
               };
2 голосов
/ 22 марта 2012
int vec_1[3] = {1,2,3};

Несмотря на то, как это выглядит, это не присваивание , это (эффективно) вызов конструктора.Он создает массив int, инициализированный этими значениями.

arrays vec_2;

Создает структуру, и каждый из массивов-членов имеет значения по умолчанию.

vec_2.x = {1,2,3};

Вы не можете назначать массивыи этот член уже построен.Обходной путь таков:

arrays vec_2 = { {1, 2, 3} };

, что совпадает с

arrays vec_2 = { {1, 2, 3}, {0, 0, 0}, {0, 0, 0} };
2 голосов
/ 22 марта 2012
arrays vec_2;
vec_2.x = {1,2,3};

Как говорится в сообщении об ошибке, вторая строка: назначение , а не инициализация .Это две разные вещи.

Вы должны сделать это:

arrays vec_2 = {
      {1,2,3}, //initializes x 
      {5,6,7}, //initializes y
      {7,8,9}, //initializes z 
};

Обратите внимание, что , разрешено после последней внутренней скобки!(т.е. {7,8,9}, <- разрешено).Такая конечная запятая обычно полезна для сгенерированного кода: вы можете добавить еще одну строку, не обращая внимания на запятую, и вам не нужно учитывать какой-либо особый случай для последней строки. </p>

1 голос
/ 22 марта 2012

В первом примере вы инициализируете вектор при его объявлении.

Во втором примере вы инициализируете дважды (недопустимо), один раз, когда вы объявляете arrays struct, а затем снова, когда вы говоритеvec_2.x = {1,2,3}

...