2016-10-05 5 views
2

まずオフにメインから動的に割り当てられた配列を渡す、私はすでにここに提示された例を見てきました:別の関数

Passing dynamically allocated array as a parameter in C

私は別の関数にパラメータとして動的に割り当てられた配列を渡すしようとしています。私は私のコードをコンパイルするとき

void InputIterations(int *iterations); 
void CalcE(long double *E, int iterations); 

int main() 
{ 
    int iterations; 
    long double *E; 

    InputIterations(&iterations); 

    E = (long double *) malloc(iterations * sizeof(long double)); 

    CalcE(&E, iterations); 
} 

void InputIterations(int *iterations) 
{ 
    printf("Enter a number of iterations: "); 
    scanf("%d", iterations); 
} 

void CalcE(long double *E, int iterations) 
{ 
    long double sum = 0; 
    int i; 
    for(i=0; i<iterations; i++) 
    { 
      sum = sum + /*formula for calculating irrational constant e*/ 
      *E = sum; 
      E++; 
    } 
} 

はしかし、私は次のエラーを取得する:

error: cannot convert ‘long double**’ to ‘long double*’ for argument ‘1’ to ‘void CalcE(long double*, int)’ CalcE(&E, iterations);

は、私はこのエラーを取得しています、なぜ誰もが知っていますか?

私の間違いを説明したり、それを説明する情報源を教えていただけたら、私は助けを非常に感謝します。

+6

は再びエラーメッセージを見てみましょう。それは本当にあなたが知る必要があるすべてを伝えます。それでもまだわからない場合は、書籍に戻り、アドレス演算子( '&')とそれが何をするのかを詳しく読んでください。とにかくそれを行う必要があります。なぜなら、あなたは本当に複数の場所でそれを悪用するからです。(例えば、 'scanf'コールも詳しく見てください)。 –

+0

'Pi'は既にポインタであり、'&Pi'はポインタへのポインタ、つまりダブルポイナであることを知る必要があります。コールは 'CalcPi(Pi、iterations);となります。 –

+0

**言語を選択してください。** C++では、単に" use std :: vector "と答えています。 –

答えて

3

を助けた:

CalcE(&E, iterations); 

をあなたが(タイプlong double *の)Eのアドレスを取得し、CalcEへの引数として渡します。 CalcEは、最初のパラメータとしてlong doubleへのポインタを受け取ります。しかし、Eのアドレスを取ると、実際にはlong doublelong double**)へのポインタへのポインタが与えられ、それはlong doubleへのポインタではありません。

error: cannot convert ‘long double**’ to ‘long double*’ for argument ‘1’ to ‘void CalcE(long double*, int)’ CalcE(&E, iterations);

だから、あなたが持っている必要があります:そして、これはあなたのエラーはあなたを伝えるものです

CalcE(E, iterations); 
3
CalcE(&E, iterations); 

CalcE(E, iterations); 

希望する必要があります私はここで

+0

はい、これは機能しました。ありがとうございました! Eはすでにポインタなので、ポインタのアドレスを渡す必要はありませんでしたか? – Corey

+0

@Coreyはい、アドレスを渡す際に、ポインタが必要な場所にダブルポインタを渡そうとしています。エラー: 'error:long double ** 'を' long double * ''に変換できません。プログラムは 'E'が指しているメモリを決して解放しないのでメモリをリークします。 – George