2012-12-28 7 views
9

ja już rozglądać się na innych wątków związanych w jakiś sposób z tym, ale jakoś po prostu nie rozumiem ...ostrzeżenie: przechodzącą argumentu „z niekompatybilnego typu wskaźnika [włączoną domyślnie]”

I chcę wykonać FFT na zbiorze wartości, które oceniłem i napisałem ten program, aby najpierw odczytać wartości i zapisać je w tablicy o rozmiarze 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); 
} 

W tym samym pliku, ja również zrobić FFT za pomocą tego programu:

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

Jednak, kiedy mogę skompilować zawsze uzyskać ten błąd:

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)]’ 

Od tego to moje pierwsze programowanie, naprawdę nie wiem, co jest nie tak z moim kodem. Czy będę musiał ustawić więcej flag dla kompilatora lub podobnych rzeczy (ponieważ musiałem to zrobić, -lm rzeczy lub nie skompilowałoby się i powiedział coś takiego, że nie znaleziono pow lub tak)?

Uświadomiono mi również, że może występować różnica podczas pisania na komputerze z systemem Windows lub Linux i używam systemu Linux, lubuntu 12.10, 32-bitowego, jeśli jest to problem systemu operacyjnego.

Odpowiedz

7

werte[] i nul[] są tablicami, ale samo słowo werte jest adresem pierwszego elementu tablicy. Więc kiedy robisz &werte, próbujesz przekazać adres o adresie (jak zauważyli @cnicutar, powinno to faktycznie odczytać wskaźnik do tablicy N elementów). TAK, wystarczy podać werte i nul bez znaków ampersand, aby przekazać adres tych tablic.

+1

* kiedy robisz & werte próbujesz podać adres z adresu * Nie bardzo. & werte daje ten sam adres, ale z innym typem. – cnicutar

+1

Przepraszamy. Nie adres pod adres, szukałem właściwego sformułowania adresu pierwszego elementu w tablicy 2D (co, jak widać, nie ma sensu samo w sobie). Znalazłem właściwy sposób, aby umieścić go w twojej odpowiedzi. :RE – varevarao

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

Upuść ampersandy z tej linii.


Problem polega na tym, że operator w tym kontekście & daje wyraz z innego typu niż FFT spodziewa. FFT oczekuje wskaźnika na podwójne i &werte tworzy wskaźnik do tablicy N elementów. Tak więc, aby uczynić FFT szczęśliwym, wystarczy przekazać werte, który po cichu zepsuje się do wskaźnika do pierwszego elementu.

Aby uzyskać więcej informacji na temat wskaźników do tablic, istnieje C FAQ.

+2

Byłoby miło, gdyby dodać trochę wyjaśnienia. –

+1

@ Daniel Fischer Dobra rozmowa. – cnicutar

+1

Dzięki, _now_ Mogę to zrobić. –