0

現在、サイズnumの配列をランダムな値で埋めようとしています。これを行うには、次の 2 つの関数を作成する必要があります。

1: num double 値の動的配列を割り当て、値を 0.0 に初期化する関数 (*createdata) を記述します。

2: rand() 関数を使用して生成されたランダム値を double 値の配列に入力する別の関数 (gendata) を記述します。

関数がどのように動作するかを書く試みは次のとおりです( 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();       
           }               
  }

ただし、上記には確かに問題があることはわかっています。

私が望むのは、メインで両方の関数を呼び出すと、乱数で満たされたサイズ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が、 として宣言しましたdoublevoid何も返さない場合は、代わりに使用してください。

ただし、後で などの他の関数で使用できるように、とにかくポインタを返す必要があるでしょ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() が double を返すと宣言されている理由もわかりません。

于 2012-12-08T17:36:06.860 に答える
0

まあ、私は malloc がどのように機能するかについてよく知りませんが、それはうまく機能するように見えますが、それを評価することはできませんが、ここで確認できる唯一の問題は次のとおりです。

ptrあなたはあなたの機能に戻っていませんcreatedataptrしたがって、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]);
    }
}
于 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ですが、[]構文から、関数が必要としているのは 1 つの へのポインターではなく、double の配列へのポインターであることがより明確になりますdouble

したがって、配列を作成してランダム化するには、次のようにします。

double* array = createdata(N); // Create an array of N doubles.
gendata(array, N); // Randomize it.
于 2012-12-08T17:44:01.133 に答える