WAARSCHUWING: GENOMEN VAN ARGUMENT ‘VANCOMPUTATIONE POINTER Type [ingeschakeld Standaard]’

Ik heb op de een of andere manier gerelateerd aan de andere draden gerelateerd, maar op de een of andere manier snap ik het gewoon niet …

Ik wil wat FFT doen op een reeks waarden die ik heb geëvalueerd en schreef dit programma om eerst de waarden te lezen en op te slaan op een reeks maat 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);
}

In hetzelfde bestand doe ik ook de FFT met behulp van dit programma:

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

Wanneer ik echter compileer ik altijd deze foutmelding:

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

Aangezien dit mijn eerste keer programmeren is, weet ik echt niet wat er mis is met mijn code. Moet ik meer vlaggen instellen voor de compiler of zoiets (omdat ik dit moest doen -lmdingen of het niet zou compileren en zei iets als Pow niet gevonden of zo)?

Ook werd ik erop gewezen dat er een verschil kan zijn bij het schrijven op een Windows- of een Linux-machine, en ik gebruik Linux, Lubuntu 12.10 32-bit als het een probleem van het besturingssysteem is.


Antwoord 1, autoriteit 100%

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

Laat ampersands van die regel vallen.


Het probleem is dat de operator &in deze context een expressie produceert met een ander type dan wat FFTverwacht. FFT verwacht een pointer naar een double en &werteproduceert een pointer naar een array van N elementen. Dus, om FFTblij te maken, geef je gewoon wertedoor dat stilletjes zal vervallen tot een pointer naar het eerste element.

Voor meer informatie over verwijzingen naar arrays is er een C FAQ.


Antwoord 2, autoriteit 58%

werte[]en nul[]zijn arrays, maar het woord wertezelf is een adres van het eerste element van de array. Dus als je &wertedoet, probeer je een adres van het adres (zoals @cnicutar opmerkte, dit zou eigenlijk een aanwijzer naar een array van N elementen moeten lezen). DUS geef gewoon werteen nuldoor zonder de ampersand-tekens om het adres van deze arrays door te geven.

Other episodes