我一直在努力解决这个问题一直持续一周,而且我一直遇到问题。
我的目标:
编写一个为整数数组分配内存的函数。该函数将整数指针,数组大小和要分配的newSize作为参数。该函数返回指向已分配缓冲区的指针。首次调用该函数时,大小将为零,并将创建一个新数组。如果在数组大小大于零时调用该函数,则将创建一个新数组,并将旧数组的内容复制到新数组中。您的讲师已提供arrayBuilder.cpp作为此编程挑战的入门代码。此外,Lab9_1.exe是此应用程序的可执行文件,您可以对其进行测试。
代码:
#include <iostream>
using namespace std;
int * arrayBuilder(int * arr, int size, int newSize);
void showArray(int * arr, int size);
int main()
{
int * theArray = 0;
int i;
cout << "This program demonstrates an array builder function." << endl << endl;
// create the initial array. The initial size is zero and the requested size is 5.
theArray = arrayBuilder(theArray, 0, 5);
// show the array before values are added
cout << "theArray after first call to builder: " << endl;
showArray(theArray, 5);
// add some values to the array
for(int i = 0; i < 5; i++)
{
theArray[i] = i + 100;
}
// show the array with added values
cout << endl << "Some values stored in the array: " << endl;
showArray(theArray, 5);
// expand the size of the array. size is not the original size. newSize
// must be greater than size.
theArray = arrayBuilder(theArray, 5, 10);
// show the new array with the new size
cout << endl << "The new array: " << endl;
showArray(theArray, 10);
cout << endl;
delete [] theArray; // be sure to do this a1t the end of your program!
system("pause");
return 0;
}
/*
FUNCTION: arrayBuilder
INPUTS Pointer to an array. Size of the array. If size is zero, arr can be NULL.
Size of the new array.
OUTPUTS: Returns a pointer to allocated memory. If newSize is greater than size,
an array of newSize is allocated and the old array is copied into the new
array. Memory pointed to by the old array is deleted. All new elements
are initialized to zero.
*/
int * arrayBuilder(int * arr, int size, int newSize)
{
// TODO: Your code goes here
return NULL; // default return value. No memory allocated!
}
/*
FUNCTION: showArray
INPUTS: Pointer to an array. Size of the array. If size is zero, arr can be NULL.
OUTPUTS: Prints the contents of the array to the console.
*/
void showArray(int * arr, int size)
{
cout << "arr = ";
for(int i = 0; i < size; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
我的挣扎:我无法弄清楚如何切换“arr”和临时数组的值。
int * arrayBuilder(int * arr, int size, int newSize)
{
// TODO: Your code goes here
int * temp = new int [newSize];
for (int i = size; i < newSize; i++)
{
*arr = *temp;
temp++;
}
return NULL; // default return value. No memory allocated!
}
寻找答案时的另一种尝试:
int * arrayBuilder(int * arr, int size, int newSize)
{
// TODO: Your code goes here
int * temp = new int [newSize];
memcpy (temp, arr, size *sizeof(int));
// HINT: Design the function before writing it.
delete[] arr;
for (int i = size; i < newSize; i++)
{
temp[i] = i;
}
return NULL; // default return value. No memory allocated!
}
基本上我的最终目标是让答案看起来像这样:
This program demonstrates an array builder function.
theArray after first call to the builder:
arr = 0 0 0 0 0
some values stored in the array:
arr = 100 101 102 103 104
the new array:
arr = 100 101 102 103 104 0 0 0 0 0
PROGRESS !!它不再崩溃:-)这就是我现在所处的位置:
This program demonstrates an array builder function.
theArray after first call to builder:
arr = -842150451 0 0 0 0
Some values stored in the array:
arr = 100 101 102 103 104
The new array:
arr = -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -8
42150451 -842150451 -842150451 -842150451
Press any key to continue . . .
我会继续修修补补,让每个人都知道我是否碰壁了!再次感谢你们!
OKAY!终于让它正确显示:
This program demonstrates an array builder function.
theArray after first call to the builder:
arr = 0 0 0 0 0
some values stored in the array:
arr = 100 101 102 103 104
the new array:
arr = 100 101 102 103 104 0 0 0 0 0
这就是我所做的。当我为“临时”添加0值时,我觉得我可能在第二部分中作弊。我的理解是,我将从前一个数组中获取数据并将其放入新数组中,而我只是重新制作它。 (因此它只适用于这组特定值[仅0])。有没有不同的方法我可以编写第二部分,所以它普遍适用于抛出的任何值???
int * arrayBuilder(int * arr, int size, int newSize)
{
int i = size;
int * temp = new int [newSize];
// What if the size is 0?
if (size <= 0)
{
while (i < newSize)
{
temp[i] = 0;
i++;
}
}
// Assuming the size _isn't_ 0
else
{
// "a new array will be created" (good)
for (i = 0; i < newSize; i++)
{
// The contents of the "old" array (arr) will be
// copied into the "new" array (temp)
while (i < size)
{
temp[i] = arr[i];
i++;
}
while (i >= size && i < newSize)
{
temp[i] = 0;
i++;
}
// as a hint, you can address the elements in
// both arrays using the [] operator:
// arr[i]
// temp[i]
}
}
// "The function returns a pointer to the allocated buffer."
// So, NULL is wrong, what buffer did you allocate?
return temp; // default return value. No memory allocated!
}
答案 0 :(得分:5)
你已经得到了答案:
memcpy (temp, arr, size *sizeof(int));
但是之后你又犯了几个错误。首先,您需要return temp ;
而不是return NULL ;
但你也不需要delete arr[] ;
如果大小为零,也不要delete arr[]
。
答案 1 :(得分:5)
因为你付出了一些努力。
编写一个为整数数组分配内存的函数。
为您提供了此功能的原型:
int * arrayBuilder(int * arr, int size, int newSize);
该函数将整数指针作为参数,大小为 数组和要分配的newSize。该函数返回一个指针 分配的缓冲区。
这对于使用“旧”(传入)数组做任何事都没有说明,所以我们应该假设它需要保持不变。
首次调用该函数时,大小将为零且为新 将创建数组。
鉴于上下文,上述文本毫无意义。随意告诉你的导师我这么说。如果大小为零,您如何知道要分配多少元素?
如果在数组大小大于零时调用该函数,则a 将创建新数组,旧数组的内容将是 复制到新数组中。
好的,现在需要做的事情很明显(你所以关闭)
int * arrayBuilder(int * arr, int size, int newSize)
{
// What if the size is 0?
// Assuming the size _isn't_ 0
// "a new array will be created" (good)
int * temp = new int [newSize];
for (int i = size; i < newSize; i++)
{
// The contents of the "old" array (arr) will be
// copied into the "new" array (temp)
// as a hint, you can address the elements in
// both arrays using the [] operator:
// arr[i]
// temp[i]
// something is wrong here...
*arr = *temp;
// you definitely _don't_ want to do this
temp++;
}
// "The function returns a pointer to the allocated buffer."
// So, NULL is wrong, what buffer did you allocate?
return NULL; // default return value. No memory allocated!
}
答案 2 :(得分:1)
只是为了帮助你意识到为什么第一次尝试不起作用:
*arr = *temp;
这是从新数组为旧数组赋值。那是倒退。
但它只针对第一个值,*arr
不会改变。您递增*temp
,但您还需要增加*arr
。 (另外,像恐怖和memcopy()这样的手动指针操作要好得多。但是,嘿,这是出于学习目的,对吗?)
另外,想想那个循环:
for (int i = size; i < newSize; i++)
对于newSize大于size的每个位,它会迭代一次。但你在这里做两件事。 1)复制数据和2)初始化新数据。你所拥有的for循环有利于浏览新数据,但它不是你想要复制已有数据的循环。这会从零到大小,对吧?
当你完成后,你需要返回你构建的数组的地址。
return NULL; // default return value. No memory allocated!
这只是一些虚拟模拟代码。它是老师的占位符。这是你应该改变的代码的一部分。
根据您的更新:
当我为“temp”
输入0值时,我觉得我可能在第二部分中作弊
那你还要放什么呢?你要复制旧的数组数据。然后你扩展数组。进入新领域的是什么?零值作为默认值是完全有效的。
我可以采用不同的方式对第二部分进行编码,以便它可以普遍适用于抛出的任何值吗?
是的,但你必须要有一些东西可以扔掉它。您的ArrayBuilder
函数可以接受其他参数possibly as a variadic function,因此它知道要将哪些值放入新字段中。但是你的函数声明没有。它所做的就是让阵列更大。
此外,在上一次编辑中,你有两个while循环遍历for循环中的i
,它也遍历i
。那会有用,但只是让你知道它有点......粗鲁。当事情变得更复杂时,这会让你陷入困境。
你可以这样做:
for (i = 0; i < newSize; i++)
{
if(i < size)
{
temp[i] = arr[i];
}
else // if(i >= size && i < newSize) //Wait a sec, this "if" is superfluous. It's conditions are enforced the the first if and the loop condition.
{
temp[i] = 0;
}
}
你也应该删除那些听起来像其他人为你编写代码的评论。因为别人为你做了功课。
最好最后,你发现了这个代码!
答案 3 :(得分:0)
这是非常复杂的代码。编程就是降低复杂性。
考虑到这一点,这是一个合适的C ++解决方案:
std::vector<int> arr = {1, 2, 3, 4, 5};
std::vector<int> copy = arr;
就是这样。我希望这能说明为什么应该使用标准库(或其他适当的库)而不是重新发明轮子。从您发布的代码中我假设您已经从一本可怕的书或课程中学习(或正在学习)C ++。垃圾邮件和get a proper book。 C ++很复杂,不需要添加不必要的复杂性。
答案 4 :(得分:0)
如果我已正确理解分配,则该功能应如下所示。 首先,我将替换函数声明
int * arrayBuilder(int * arr, int size, int newSize);
的
int * arrayBuilder( const int *arr, size_t size, size_t newSize );
这是它的定义
int * arrayBuilder( int * arr, int size, int newSize)
{
int *tmp = 0;
if ( newSize >= 0 )
{
tmp = new int[newSize] {};
int copy_size = std::min( size, newSize );
if ( copy_size > 0 ) std::copy( arr, arr + copy_size, tmp );
}
delete []arr;
return tmp;
}
答案 5 :(得分:0)
试试这个:
代码:
#include <iostream>
using namespace std;
int a[3] =
{
1,
2,
3
};
int b[3];
int main ()
{
cout << endl;
cout << "Array #1 elements: " << endl;
for(int i = 0; i < 3; ++i)
{
cout << a[i] << " ";
}
for(int i = 0; i < 3; ++i)
{
b[i] = a[i];
}
cout << endl << endl;
cout << "Copying Array #1 elements to Array #2..." << endl;
cout << endl;
cout << "Array #2 elements: " << endl;
for(int i = 0; i < 3; ++i)
{
cout << b[i] << " ";
}
cout << endl << endl;
return 0;
}