2014-02-11 5 views
4

Я хочу, чтобы создать структуру, которая содержит массивы фиксированного размера внутри:массива внутри структуры

struct smt{ 
    int array1[3]; 
    int array2[10]; 
    int bananas; 
}; 

Так что я могу использовать его в моем основном коде. Однако, когда я пытаюсь заполнить массивы Я всегда получаю ошибку:

int main(){ 
    smt name; 
    name.array1 = {1,2,3}; 

    return 0; 
} 

Ошибки на name.array1 = {...}; line:

error C2059: syntax error : '{' 
error C2143: syntax error : missing ';' before '{' 
error C2143: syntax error : missing ';' before '}' 

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

+1

Массивы не могут быть назначены. Если вам нужен массив, который работает лучше, используйте 'std :: array'. – chris

ответ

5

Вы не можете сделать это, если это не в инициализации . Вы должны сделать:

name.array1[0] = 1; 
name.array1[1] = 2; 
name.array1[2] = 3; 

Смотреть это полезно answer:

It's not just arrays, you cannot provide an initializer for anything at any point other than in a definition. People sometimes refer to the second statement of something like int i; i = 0; as "initializing i". In fact it's assigning to i, which previously holds an indeterminate value because it wasn't initialized. It's very rarely confusing to call this "initializing", but as far as the language is concerned there's no initializer there.

4

{...} синтаксис может быть использован только во время инициализации.

Чтобы использовать этот синтаксис, вам необходимо инициализировать структуру сразу.

Для Exemple:

struct smt { 
    int array1[3]; 
    int array2[10]; 
    int bananas; 
}; 

struct smt mystruct = { 
    { 1, 2, 3 }, 
    { 1, 2 ,3 ,4 5, 6, 7, 8, 9, 10 }, 
    0 
}; 

Также отметим, что в C99 (но не C++), вы можете использовать назначенные инициализаторами, как это, чтобы улучшить читаемость:

struct smt mystruct = { 
    .array1 = { 1, 2, 3 }, 
    .array2 = { 1, 2 ,3 ,4 5, 6, 7, 8, 9, 10 }, 
    .bananas = 0 
}; 
+0

'struct' в 'mystruct' объявлении бесполезно. А зачем говорить о C99, когда вопрос помечен C++? – Davidbrcz

1

С C++ 11 равномерная список инициализаторов, вы можете это сделать (он также будет работать на C++ 03, потому что smt - POD).

#include <iostream> 
using namespace std; 

struct smt{ 
    int array1[3]; 
    int array2[10]; 
    int bananas; 
}; 

int main() { 
//I use {} to do a value-initialization (to zero) of array2 
smt s={{0,1,2},{},5}; 

std::cout<<s.array1[0]<<std::endl; 
return 0; 
} 

Кроме того, с помощью std::array позволяет сделать так:

std::array<int,4> a; 
a={1,2,3,4}; 

Потому что оператор присваивания по умолчанию для std::array, генерируемый компилятором.

0

Это утверждение

name.array1 = {1,2,3}; 

не инициализации при определении объекта. Это оператор присваивания. Но массивы не имеют оператора присваивания.

Вы можете инициализировать свой массив во время создания объекта структуры. Например

smt name = { { 1, 2, 3 } }; 

Или, если вы действительно необходимо присвоить 1, 2, 3 к элементам массива можно использовать стандартный алгоритм зЬй :: йоту.Например

std::iota(std::begin(name.array1), std::end(name.array1), 1); 

Или вы можете присвоить каждый элемент массива, как раздельно, например

name.array1[0] = 1; 

Что использовать синтаксис, который первоначально хотел, вы должны заменить определение массива для станда :: массива. Например

#include <array> 
struct smt{ 
    std::array<int, 3> array1; 
    std::array<int, 10> array2; 
    int bananas; 
}; 

В этом случае такой код, как

int main(){ 
    smt name; 
    name.array1 = {1,2,3}; 

    return 0; 
} 

будут действительны при условии, что ваш компилятор поддерживает C++ 2011 Standard.

Смежные вопросы