0

目前我正在尝试用随机值填充大小为num的数组。为此,我需要创建两个函数:

1:编写一个函数 (*createdata),分配一个包含num double 值的动态数组,将这些值初始化为 0.0。

2:编写一个不同的函数(gendata),该函数将使用 rand() 函数生成的随机值填充一个双精度值数组。

这是我尝试编写函数的操作方式(在 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的数组,其中填充了随机数。

4

4 回答 4

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完全使用后不要忘记指针。
  • 你没有在你的 function 中返回任何东西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;
}
于 2012-12-08T17:38:39.420 回答
0

您需要返回在 createdata() 函数中分配的数组,否则您不能在 gendata() 或其他任何地方使用它。

我也不确定为什么 gendata() 被声明为返回双精度。

于 2012-12-08T17:36:06.860 回答
0

好吧,我不太熟悉 malloc 的工作原理,虽然它看起来可以正常工作,所以我无法评估,但我能在这里看到的唯一问题是:

你没有返回ptr你的createdata函数。因此,当您尝试ptrgendata函数中访问时,范围内没有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]);
    }
}
于 2012-12-08T17:41:09.253 回答
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.
于 2012-12-08T17:44:01.133 回答