C ++ присваивает массив целых чисел пустому массиву целых размеров - PullRequest
2 голосов
/ 14 декабря 2011

Я очень знаком с Java, и это разрешено там. Однако похоже, что это не с C ++. Я получаю "недопустимое назначение массива" при попытке присвоить valuesToGrab = updateValues;.

//these are class attributes
int updatingValues[361] = {0};
int valuesToGrab[361] = {0};

//this is part of a function that is causing an error. 
for (unsigned int i=0; i < 10; i++) {

    //this fills values with 361 ints, and num_values gets set to 361. 
    sick_lms.GetSickScan(values,num_values);

    //values has 361 ints, but a size of 2882, so I copy all the ints to an array
    //of size 361 to "trim" the array.
    for(int z = 0; z < num_values; z++){
        updatingValues[z] = values[z];
    }

    //now I want to assign it to valuesToGrab (another program will be 
    //constantly grabbing this array, and it can't grab it while it's being
    //populated above or there will be issues
    valuesToGrab = updatingValues; // THROWING ERROR
}

Я не хочу перебирать updateValues ​​и добавлять его в valuesToGrab один за другим, но если потребуется, я сделаю это. Есть ли способ, которым я могу назначить его в одной функции с C ++?

Спасибо

Ответы [ 4 ]

6 голосов
/ 14 декабря 2011

Стандартная идиома для копирования в C ++:

#include <algorithm>
...
std::copy(values, values+num_values, updatingValues);

убедитесь, что updatingValues достаточно велико, иначе вы получите переполнение и произойдут плохие вещи.

Тем не менее, в C ++ мы обычно используем std :: vector для такого рода задач.

#include <vector>
...
std::vector<int> updatingValues=values; //calls vectors copy constructor

I vector выполняет все, что делает массив (включая статическую инициализацию в C ++ 11), но имеет четко определенный интерфейс. с итераторами, размером, пустым, изменением размера, push_back и т. д.

http://en.cppreference.com/w/cpp/algorithm/copy

http://en.cppreference.com/w/cpp/container/vector

EDIT Стоит также отметить, что вы можете комбинировать вектор и массивы.

std::vector<int> vect(my_array, my_array+10);
//or
std::vector<int> another_vector;
...
another_vector.assign(my_array, my_array+10);//delayed population

и наоборот

std::copy(vect.begin(), vect.end(), my_array); //copy vector into array.
2 голосов
/ 14 декабря 2011

Прежде всего, я не думаю, что это будет делать то, что вы ищете, потому что valuesToGrab = updatingValues; перезапишет ваш valuesToGrab каждый цикл внешнего цикла.

Предполагая, что вы действительно хотите сделатьэто, хотя, и вы не хотели менять на вектор:

std::copy(updatingValues, updatingValues+361, valuesToGrab);

сделает это.Вы можете рассматривать обычный массив как std :: container в любом алгоритме std ::, указатели считаются итераторами с произвольным доступом.вероятно, не нужно копировать.

2 голосов
/ 14 декабря 2011

В C ++ идиоматический контейнер для использования вместо массивов - std::vector. С vector или с массивами вы можете использовать функцию std::copy() из заголовка <algorithm>, которая является предпочтительным способом копирования контейнеров любого вида в C ++. С vector:

std::vector<int> updatingValues, valuesToGrab;

// Ensure the vector has sufficient capacity to accept values.
updatingValues.resize(361);

// Copy values from the array into the vector.
std::copy(values, values + 361, updatingValues.begin());
//        Source begin & end;   Destination begin.

// Copy one vector to another.
valuesToGrab = updatingValues;

С массивами:

std::copy(valuesToGrab, valuesToGrab + 361, updatingValues);

Опять же, просто с массивами, если вы хотите больше стиля C, вы можете использовать функцию стандартной библиотеки C memcpy(), из <cstdlib>:

memcpy(valuesToGrab, updatingValues, 361 * sizeof(int));
//     Destination;  Source;         Number of bytes.

С memcpy() (и его двоюродным братом, memmove()) вы должны быть осторожны с размером копируемых элементов; если вы скажете 361 вместо 361 * sizeof(int), вы скопируете 361 байт, а не 361 int с байтов - большая разница.

0 голосов
/ 14 декабря 2011

Имейте в виду, что массивы реализованы как указатели в C и C ++.

В частности, массив в стеке может быть визуализирован как указатель на постоянное место в памяти, которое имеет емкость, запрошенную вами длямассив.Эта память находится в стеке.Когда вы пытаетесь valuesToGrab = updatingValues, вы можете думать об этом как о попытке скопировать адрес updatingValues в переменную valuesToGrab.Это НЕ попытка глубокой копии, которую вы, похоже, пытаетесь сделать.Однако valuesToGrab указывает на постоянное место в памяти и не может быть обновлено.Стандарт немного более конкретен в этом отношении и явно запрещает присвоение массивов, поэтому вы получаете конкретную ошибку, которую видите.

Вам нужно будет использовать цикл или что-то вроде std::copy или C memcpy для копирования значений из одного массива в другой.

...