2015-03-21 2 views
0

Так что я пишу довольно длинный код, и теперь у меня возникла проблема. Как изменить значения атрибута структуры и вернуть их к основной функции. То, что я пытаюсь выполнить эту функцию, заключается в следующем: вставить новое значение в первое место (то есть 0). Все для цикла освобождает Z [0] и отлично работает. Но я не знаю, как вернуть весь структурный массив CHANGED в основную программу. Как это сделать?Возвращаемое значение массива структуры

спасибо. P.S. извините, за мой сломанный английский.

Вот части необходимый код:

void insertion(Player Z[], int size); //declaration of the funcion 
... 
int main() 
{ 
    int size=5; 
    Player *Z = new Player[size]; 
    Insertion(Z, size); //calling the function 
    ... 
} 

void Insertion(Player Z[], int size) //function 
{ 
    size++; 
    Player* temp = new Player[size]; 

    for(int i=0;i<=size-1;i++) 
    { 
     temp[i+1]=Z[i]; 
    } 

    delete [] Z; 
    Z = temp; 
    cin>>Z[0].name; 
    cin>>Z[0].surname; 
} 
+2

Использование 'std :: vector '. –

+0

Я новичок в программировании на С ++. Я понимаю, что std :: vector используется для изменения размера массивов. Но помогает ли это каким-либо образом вернуть значение массива из функции? Где я могу найти лучшую информацию о std :: vector или вы можете дать простой пример, как использовать его в этом случае? – Rokelio

+0

@Rokelio: http://en.cppreference.com/w/cpp/container/vector. Тем не менее, каждая книга C++ ** должна ** охватывать 'std :: vector'. Если у вас нет, то выбросьте его. 'std :: vector' является одним из стандартных классов контейнеров C++. Это часть языка. Вы используете его по умолчанию для каждой проблемы * «У меня есть коллекция X-вещей, и X будет только известна, когда программа будет работать» * kind. Не используйте 'new []'. –

ответ

2

Я вижу много проблем в вашем коде.

Например, почему вы выделяете массив из 5 игроков, а затем освобождаете массив и выделяете массив снова, имея одинаковый размер? В чем польза?

Вы также должны заметить, что C++ имеет семантику посылок, поэтому линии delete[] Z и Z = temp не имеют эффекта вне функции, которую вы вызываете. Таким образом, эта функция должна иметь подпись void Insertion(Player **Z, int size); или Player *Insertion(Player *Z, int size), если вы не хотите изменять аргумент на месте, но вместо этого возвращаете новое значение.

Замечания, предложенные с использованием std::vector. Я очень рекомендую этот подход. Если вам нужен контейнер с переменным размером, std :: vector - лучший выбор.

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

+1

* "Итак, эта функция должна иметь подпись void Insertion (Player ** Z, int size);" * Это по-прежнему вызывает по умолчанию. Это просто, что переданное значение оказывается двойным указателем. Вы можете получить вызов по ссылке, просто используя ссылку на указатель: 'void Insertion (Player * & Z, int size)'. Конечно, это не имеет практического значения, поскольку 'std :: vector' решает всю проблему в значительно более высоком смысле. –

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