Я хотел бы написать функцию (changeSize), которая использует DMA, где я могу изменить размер (массива) на любой другой, где oldEls — это исходный размер, а newEls — новый размер. Если newEls больше, чем oldEls, я бы просто добавил нули в конец, а если он меньше, чем oldEls, я бы просто усек. Параметр «ptr» должен указывать на новый массив. Насколько я понимаю, это будет похоже на функцию C realloc ().
С кодом ниже, я вывожу следующее: 0, 0, 3, 6, 0, 0, 0, 0, где правильный вывод должен быть 4, 2, 3, 6, 0, 0, 0, 0. Я также понимаю, что моя функция показа, возможно, не самая лучшая функция для вывода нового массива, поскольку я должен явно указать размер элемента массива.
Заранее спасибо.
#include <iostream>
#include <cstdlib>
using namespace std;
void show( const int a[], unsigned elements );
int * copy( const int a[], unsigned els );
void changeSize( int * & ptr, int newEls, int oldEls );
void die(const string & msg);
int main()
{
int arr[4] = {4, 2, 3, 6};
show(arr, 4);
int * newArr = copy(arr, 4);
cout << endl << endl;
changeSize(newArr, 8, 4);
show(newArr, 8);
}
void show( const int a[], unsigned elements )
{
for (int i = 0; i < elements; i++)
cout << a[i] << endl;
}
int * copy( const int a[], unsigned els )
{
int *newArr;
try
{
newArr = new int[els];
}
catch(const bad_alloc &)
{
die("Copy: Alloc Failure");
}
for (int i = 0; i < els; i++)
newArr[i] = a[i];
return newArr;
}void changeSize( int * & ptr, int newEls, int oldEls )
{
int * newArr;
try
{
newArr = new int[newEls];
for (int i = 0; i < oldEls; i++)
{
newArr[i] = ptr[i];
}
if (newEls > oldEls)
{
for (int k = oldEls; k < newEls; k++)
newArr[k] = 0;
}
}
catch(const bad_alloc &)
{
die("changeSize: Alloc Failure");
}
ptr = newArr;
delete[] newArr;
}void die(const string & msg)
{
cerr << "Fatal error: " << msg << endl;
exit(EXIT_FAILURE);
}
Прежде всего, вы звоните удалить на newArr
в конце changeSize
, вам нужно удалить старое значение ptr (которое вы сейчас отбрасываете). Это (вероятно) проблема
Пока я в этом, я хотел бы обратить ваше внимание на std::vector
, Это в основном массив с изменяемыми размерами.
Кроме того, копирование сырых блоков памяти еще лучше всего сделано с memcpy
, не тратьте свое время на написание циклов просто для копирования int
s, делайте это только для классов C ++.
РЕДАКТИРОВАТЬ: с помощью std::copy
является лучшим решением для C ++, он использует memcpy
когда это возможно, в противном случае это то же самое, что и для цикла копирования объектов.
Ура!