web-dev-qa-db-ja.com

警告:互換性のないポインタ型から引数を渡す[デフォルトで有効] '

どういうわけかこれに関連する他のスレッドを見回してきましたが、どういうわけか私はそれを取得できません...

評価してこのプログラムを作成した一連の値に対してFFTを実行して、最初に値を読み取り、サイズnの配列に保存したいと思います。

int main () {
    // some variables and also a bit of code to read the 'messwerte.txt'

printf("Geben sie an wieviele Messwerte ausgelesen werden sollen: ");
scanf("%d", &n);
double werte[n]; //Array der "fertigen" Messwerte
in = fopen ("messwerte.txt","r");
double nul[n]; //Array von nullen

int logN = 14;
l=FFT(logN,&werte,&nul);
}

同じファイルで、このプログラムを使用してFFTも実行します。

double FFT (int logN, double *real, double *im) //logN is base 2 log(N) {
// blabla FFT calculation
}

ただし、コンパイルすると、常に次のエラーが発生します。

gcc FFT.c -lm
FFT.c: In function ‘main’:
FFT.c:94:2: warning: passing argument 2 of ‘FFT’ from incompatible pointer type [enabled by default]
FFT.c:4:8: note: expected ‘double *’ but argument is of type ‘double (*)[(unsigned int)(n)]’
FFT.c:94:2: warning: passing argument 3 of ‘FFT’ from incompatible pointer type [enabled by default]
FFT.c:4:8: note: expected ‘double *’ but argument is of type ‘double (*)[(unsigned int)(n)]’

プログラミングは初めてなので、コードのどこが悪いのか本当にわかりません。コンパイラまたはそのようなものにさらにフラグを設定する必要がありますか(これを行う必要があったため-lmもの、またはコンパイルされず、powが見つからないなどと言ったのですか?

また、WindowsまたはLinuxマシンでの書き込みでは違いがある可能性があることに気づきました。OSの問題であれば、Linux、Lubuntu 12.1032ビットを使用しています。

10
mitit100
l=FFT(logN,&werte,&nul);
           ^      ^

その行からアンパサンドを削除します。


問題は、このコンテキストの&演算子が、FFTが期待するものとは異なるタイプの式を生成することです。 FFTはdoubleへのポインターを予期し、&werteはN個の要素の配列へのポインターを生成します。したがって、FFTを幸せにするには、werteを渡すだけで、最初の要素へのポインタに静かに減衰します。

配列へのポインタの詳細については、 C FAQ があります。

11
cnicutar

werte[]およびnul[]は配列ですが、Word werte自体は配列の最初の要素のアドレスです。だからあなたがするとき&werteアドレスのアドレスを渡そうとしています(@ cnicutarが指摘したように、これは実際にはN個の要素の配列へのポインタを読み取る必要があります)。 SO wertenulをアンパサンド記号なしで渡すだけで、これらの配列のアドレスを渡すことができます。

7
varevarao