2012-12-28 61 views
9

我已经在某种程度上与此相关的其他线程四处寻找,但不知何故,我只是不明白它传递参数...警告:“从兼容的指针类型[默认启用]”

我想对我已评估过的一组值进行一些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计算机上编写时可能会有所不同,并且我正在使用Linux,Lubuntu 12.10 32位(如果它是操作系统的问题)。

回答

7

werte[]nul[]是数组,但字werte本身是数组的第一个元素的地址。所以当你做&werte时你试图传递地址的地址(就像@cnicutar指出的那样,实际上它应该读取指向N个元素的数组)。所以只通过wertenul没有&符号来传递这些数组的地址。

+1

*当你做了&werte你试图传递一个地址的地址*并非如此。 &werte会产生相同的地址,但是类型不同。 – cnicutar

+1

对不起。不是一个地址的地址,我正在寻找二维数组中第一个元素的地址的正确措辞(正如你所看到的,它本身没什么意义)。尽管如此,我找到了正确的方法来将它放在你的答案中。 :d – varevarao

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

从该行删除&符号。


的问题是,在操作者&在这方面产生了表达与不同类型的比FFT期望。 FFT期望一个指向双精度的指针,并且&werte产生一个指向包含N个元素的数组的指针。所以,为了让FFT开心,只要通过werte就会悄悄衰减到指向第一个元素的指针。

有关指向数组的指针的更多信息,有C FAQ

+2

如果你想添加一些解释,那会很好。 –

+1

@DanielFischer很好的电话。 – cnicutar

+1

谢谢,我现在可以放弃它。 –

相关问题