2015-10-14 4 views
0

Я не очень привык к кодированию на C++, и это, вероятно, простая проблема, что я не могу получить правильный синтаксис.C++ Array инициализации структуры

То, что я в основном пытаюсь достичь, состоит в том, что из одного метода, когда я объявляю массив структуры (размер не указан), я вызываю метод, в котором я передаю этот массив. Метод должен инициализировать значения массива. Я пытался получить простой код, но получал ошибки. Следующий фрагмент кода дает мне ошибку компиляции. Может ли кто-нибудь указать, как этого добиться?

struct ABC 
{ 
int a; 
int b; 
}; 

void test(ABC * a) 
{ 
a[] = {{2,3},{4,5}}; 
} 

int main() { 
    ABC arr[2]; 
    test(arr); 
}  

EDIT:
следующие работы, но я хотел бы инициализации работать в одной строке.

struct ABC 
{ 
int a; 
int b; 
}; 

void test(ABC *a) 
{ 
a[0].a = 2; 
a[0].b = 3; 
a[1].a = 4; 
a[1].b = 5; 
} 

int main() { 
    ABC arr[2]; 
    test(arr); 
} 
+0

Если у вас есть ошибки компиляции, убедитесь, что вы включили точный текст сообщения. – crashmstr

+1

Важный бит, чтобы узнать о тасовании массива-указателя. Когда этот массив разлагается на указатель, это указатель. Вы потеряли важную информацию: размер. – user4581301

+0

Мне кажется странным, что вы указываете размер в основном цикле, так как используете этот размер в тестовой функции. – Chiel

ответ

2

Вы можете использовать настройки, как это, что делает использование стандартной библиотеки С ++. Собирать с -std=c++11 флагом, чтобы для инициализации я сделал в push_back:

#include <vector> 
#include <iostream> 

struct ABC 
{ 
    int a; 
    int b; 
}; 

void test(std::vector<ABC>& a) 
{ 

    a.push_back({2,3}); 
    a.push_back({4,5}); 
} 

int main() 
{ 
    std::vector<ABC> arr; 
    test(arr); 

    // Test the outcome... 
    std::cout << "The size is: " << arr.size() << std::endl; 
    for (ABC& a : arr) 
     std::cout << "Element (" << a.a << "," << a.b << ")" << std::endl; 

    return 0; 
} 
+0

Хотя это не использует массивы, как то, что мой вопрос задал, мне на самом деле нравится простота этого ответа :) – sachin11

+0

То, как вы используете размер массива, разочаровало меня. Вы также можете создать функцию, которая передала массив, если это важно для вас? – Chiel

+0

@ sachin11 примерно так же часто, как вы не обнаружите, что это «вектор» для победы в сравнении с массивами. – user4581301

0

Инициализировать каждую структуру, обращаясь к ее индексу в массиве a.

void test(ABC * a) 
{ 
    a[0] = {2,3}; 
    a[1] = {4,5}; 
    ... 

Таким образом {{2,3},{4,5}}; будет работать при инициализации, то есть

ABC arr[2] = { 
    {2,3}, 
    {4,5} 
}; 
-1

Вы должны сначала выяснить, фактический размер массива, а затем итерацию для его инициализации.

не будет работать, смотрите ниже

void test(ABC* a) {   
    int value=2; 
    for (int i=0;i++;i<sizeof(a)/sizeof(ABC)) { 
     a[i].a=value; 
     a[i].b=value+1; 
     value+=2; } } 

Я не 100% уверен, что SizeOf (а) будет работать в предоставлении вам размер массива. Если это не работает, вам придется пройти размер массива в качестве параметра:

void test(ABC* a, int elements) {   
    int value=2; 
    for (int i=0;i++;i<elements) { 
     a[i].a=value; 
     a[i].b=value+1; 
     value+=2; } } 

int main() { 
    ABC arr[2]; 
    test(arr,2); } 
+0

Почему вы даете такой анти-совет? – SergeyA

+0

Сергей, некоторые пытаются помочь, а не публиковать забавные комментарии. – SunKnight0

+0

Помогите кому-то утопить его? – SergeyA

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