2014-02-14 3 views
0

Хорошо, я пишу программу, которая будет выполнять различные функции в массиве. При необходимости массив должен будет изменить емкость. Инструкции:Указатель/Обратитесь к массиву?

  1. Создайте новый массив.
  2. Скопируйте содержимое из старого массива в новое.
  3. Удалить старый массив.

Эта часть понимает, но я не понимаю, как сохранить ссылку на массив, с которым будут работать функции. Это мой код для создания нового массива и перемещения по элементам.

int newSize = m_size*2; 

    double *tempArray= new double[newSize]; 
    for(int i=0; i<m_size-1; i++) 
    { 
    tempArray[i] = arr[i]; 
    } 

    delete []arr; 
    for(int i=0; i<m_size-1; i++) 
    { 
    arr[i] = tempArray[i]; 
    } 

    delete []tempArray; 

} 

Все другие методы используют обр, так что я хотел бы сослаться назад к этому. Указатель не работает, поскольку он указывает только на первый элемент. Как использовать переменную arr для ссылки на массив?

+0

Я думаю, что удаление [] arr должно быть arr = new .... – tenfour

ответ

1

У вас есть undefined поведение в вашем коде.

delete []arr; 
for(int i=0; i<m_size-1; i++) 
{ 
    arr[i] = tempArray[i]; 
} 

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

delete []arr; 
arr = tempArray; 

Весь код будет:

int newSize = m_size*2; 

double *tempArray= new double[newSize]; 
for(int i=0; i<m_size-1; i++) // -1 might be wrong, look below for a comment on this line. 
{ 
    tempArray[i] = arr[i]; 
} 

delete []arr; 
arr = tempArray; 
m_size = newSize // stolen from the others *cough* since I oversaw the need. 
// note that I don't call delete on tempArray. 
} 

Кроме того, я не знаю, как вы выделили первый массив, но если вы сделали это вызывая new double[m_size], то вы бы хотели для удаления -1 в режиме цикла цикла for, поскольку вы проверяете i < m_size, а не i <= m_size.

+0

Это, похоже, решило мою проблему, спасибо. , почему бы вам не удалить tempArray? – marsrover

+0

@marsrover 'tempArray' просто предназначен как временный указатель на новый массив при копировании старых данных. После этого вы сделаете' arr' точкой для этого блока памяти, так что вы 'll все еще должен быть в состоянии достигнуть этого (удаление этого не позволило бы вам все еще получить к нему доступ). –

+0

@marsrover также надеюсь, что вы заметили мое последнее редактирование, где я добавил 'm_size = newSize' (у других была эта часть уже, но я забыл, что мы должны отслеживать новый размер в моем ответ сначала). –

0

Вам необходимо выделить память для ar после ее освобождения.

int newSize = m_size*2; 

double *tempArray= new double[newSize]; 
for(int i=0; i<m_size-1; i++) 
{ 
    tempArray[i] = arr[i]; 
} 

delete []arr; 
ar = new double[newSize]; 
for(int i=0; i<m_size-1; i++) 
{ 
    arr[i] = tempArray[i]; 
} 

delete []tempArray; 
+0

Вся вторая половина этого прошлого 'delete [] arr;' может быть заменена просто 'arr = tempArray;'. И вам нужно обновить 'm_size' как новый размер,' m_size = newSize; ' – WhozCraig

0
delete []arr; 
for(int i=0; i<m_size-1; i++) 
{ 
arr[i] = tempArray[i]; 
} 

К сожалению. Не удалять после удаления. И не удаляйте, если не было выделено новым.

Вы просто не можете перераспределить массив объявлен как

int arr[100] 

или подобное.

0

на основе кода, который вы дали, что вы в настоящее время выступает в:

  1. Создать новый массив (tempArray)
  2. Скопируйте содержимое старого (arr) массива в новый (temp) - (примечание - что произойдет, если вы сделаете новый массив меньше, чем старая?)
  3. Удалить старый массив
  4. Скопируйте новые значения обратно в удаленные остатки старого массива (обратите внимание - вы удалили arr так лет и не может использовать его сейчас!)
  5. Удалите новый массив (поэтому все прошло)

В принципе, вам нужно исправить шаг 2, чтобы справиться с размерами, и избавиться от шагов 4 и 5 полностью - вам просто нужно назначить вместо этого arr: arr = tempArray

0

Вам просто нужно объявить массив arr и поместить в него значения. Вы можете обратиться к массиву через его указатель arr или каждый элемент с помощью arr [element_id].

2

В динамических массивах C и C++ обычно отображается указатель на первый элемент и количество элементов.Таким образом, я предполагаю, что следующие объявления:

double *arr; 
int m_size; 

Если случайно у вас есть arr decleared как реальный массив double arr[..], то вы не можете сделать delete []arr ни изменить его размер!

Тогда ваш код должен быть вдоль линий:

int newSize = 2*m_size; 
double *tempArray= new double[newSize]; 
for(int i=0; i<m_size-1; i++) 
{ 
    tempArray[i] = arr[i]; 
} 
delete []arr; 
arr = tempArray; 
m_size = newSize; 

Но теперь я задаюсь вопросом: почему m_size-1 в цикле?

А также, вы можете просто сделать:

memcpy(tempArray, arr, sizeof(*arr) * m_size)); //or m_size-1? 

Все это хорошо, если это упражнение. Для реального кода почти всегда лучше использовать функции std::vector<double> и resize().

+0

" .. почему m_size-1 в цикле? " - потому что 'm_size' - это * существующая величина распределения' arr'. Возможно, это было более очевидно как «std :: copy (arr, arr + m_size, tempArray)», но, зная, что OP, вероятно, будет использовать 'std :: vector <>' в первую очередь. – WhozCraig

+0

@WhozCraig: Но тогда последний элемент массива ('arr [m_size-1]' не копируется! Или я что-то упустил (не каламбур)? – rodrigo

+0

Вы вообще ничего не пропустили. Мне действительно нужно, по крайней мере, две чашки кофе, прежде чем оставлять комментарии к SO так рано утром (и я был первым +1 по этому ответу, кстати). – WhozCraig

0

У вас есть несколько вариантов здесь:

  1. принять подход C-стиль просто хранить указатель на первый элемент, как у вас есть, плюс длину. Из этих двух вы можете рассчитать все, что вам нужно.

  2. Использование std::vector. Он содержит массив, который позволяет легко изменять его с помощью функций, таких как emplace_back, и может рассказать вам о его длине с функцией size.

Второй подход, безусловно, предпочтителен. Если вы находитесь на C++, вы обычно должны использовать std::vector вместо необработанных массивов, если только вы не ищете фиксированный размер. В этом случае используйте std::array.

Вы также получаете дополнительное преимущество копирования вектора так же просто, как vector1 = vector2;.

+0

Я бы предположил, что это домашнее задание, поэтому «изобретать колесо» - это то, что нужно – benjymous

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