目前我正在尝试使用随机值填充大小 num 的数组。为此,我需要创建两个函数:
1:编写一个函数(* createdata),分配 num 双精度值的动态数组,将值初始化为0.0。
2:编写一个不同的函数(gendata),它将使用rand()函数生成的随机值填充double值数组。
这是我尝试编写函数如何操作(在main()之外):
double *createdata(int num)
{
int i = 0;
double *ptr;
ptr = (double *)malloc(sizeof(double)*num);
if(ptr != NULL)
{
for(i = 0; i < num; i++)
{
ptr[i] = 0.0;
}
}
}
double gendata(int num)
{
createdata(num);
int j = 0;
for(j = 0; j < num; j++)
{
ptr[j] = rand();
}
}
但是,我知道上述内容肯定有问题。
我想要的是,一旦我在main中调用了两个函数,我将生成一个大小为 num 的数组,其中填充了随机数。
答案 0 :(得分:2)
你必须将分配的指针传递给gendata
函数,因为在它的当前形式中,ptr
是未知的。那甚至可以编译吗?
示例:
double *createdata(int num)
{
int i = 0;
double *ptr;
ptr = (double *)malloc(sizeof(double)*num);
if(ptr != NULL)
{
for(i = 0; i < num; i++)
{
ptr[i] = 0.0;
}
}
return ptr;
}
和
double gendata(int num)
{
double *ptr = createdata(num);
int j = 0;
if(ptr != NULL)
{
for(j = 0; j < num; j++)
{
ptr[j] = rand();
}
}
}
另请注意,我正在检查来自NULL
的返回malloc
。
其他人可能会在此处提出的其他提示:
malloc
。free
指针。gendata
中返回任何内容,但您将其声明为double
。如果您不打算返回任何内容,请使用void
。但是你可能还需要从它返回指针,这样你以后可以在其他函数中使用它,例如main
。
编辑:所以,这就像这样,例如:
double *gendata(int num)
{
double *ptr = createdata(num);
int j = 0;
if(ptr != NULL)
{
for(j = 0; j < num; j++)
{
ptr[j] = rand();
}
}
return ptr;
}
在您的main
:
int main(void)
{
double *data;
data = gendata(100);
printf("%g\n", data[5]);
// When you're done, call free
free(data);
return 0;
}
答案 1 :(得分:0)
您需要返回createdata()函数中分配的数组,否则您无法在gendata()或其他任何地方使用它。
我不确定为什么gendata()被声明为返回double。
答案 2 :(得分:0)
好吧,我不太熟悉malloc的工作方式,虽然看起来效果很好,所以我无法评估,但我能看到的唯一问题是:
您没有在ptr
函数中返回createdata
。因此,当您尝试访问ptr
函数中的gendata
时,范围内没有ptr
数组。这会给你一个错误。此外,gendata
函数甚至不返回任何内容。
看看这段代码,这应该可行:
double *createdata(int num)
{
int i = 0;
double *ptr;
ptr = (double *)malloc(sizeof(double)*num);
if(ptr != NULL)
{
for(i = 0; i < num; i++)
{
ptr[i] = 0.0;
}
}
return ptr; // return the pointer
}
double *gendata(int num) // you forgot the '*' here
{
double *ptr = createdata(num);
int j = 0;
for(j = 0; j < num; j++)
{
ptr[j] = rand();
}
return ptr; // i added this so you obviously return the pointer
}
我相信这会奏效,这是一个使用它的例子:
int main()
{
int c;
double *data = gendata(8);
for(c = 0; c < 8; c++)
{
printf("%f\n", data[c]);
}
}
答案 3 :(得分:0)
在createdata()中,你忘了在最后实际返回指向新分配数组的指针:
return ptr;
此外,您的gendata()函数需要处理现有的数组,而不是生成自己的数组。您应该将其添加为参数。此外,它不需要返回任何东西。所以:
void gendata(double ptr[], int num)
{
int j = 0;
if (ptr != NULL) {
for(j = 0; j < num; j++) {
ptr[j] = rand();
}
}
}
但是,您可以简化上述操作并降低嵌套级别:
void gendata(double ptr[], int num)
{
int j = 0;
if (ptr == NULL)
return;
for(j = 0; j < num; j++) {
ptr[j] = rand();
}
}
请注意,double ptr[]
实际上与double* ptr
相同,但[]
语法使得函数想要的是指向双精度数组而不是指针数的指针更明显到一个double
。
所以现在为了创建一个数组然后将其随机化,你可以这样做:
double* array = createdata(N); // Create an array of N doubles.
gendata(array, N); // Randomize it.