2016-04-17 11 views
2

hat ich ac Funktion hätte, die eine falsche Verhalten hat und ich so etwas wie diese nie vielleicht jemand gesehen, mich über dieses völlige Rätselunter Linux, c Funktion verrückt Verhalten

so in test.c ist die Funktion aufklären könnte:

float wtf(int c) 
{ 
    return 0.0; 
} 

in main.c

float a=wtf(0); 
float b=wtf(2); 
float c=wtf(3); 
float d=wtf(4); 
printf("%f %f %f %f\n",a,b,c,d); 

und das Ergebnis:

0.000000 2.000000 3.000000 4.000000 

Warum wird der Parameter irgendwie von der Funktion ausgegeben, die 0 ausgeben soll?

hier ist, wie ich es unter Linux kompilieren

cc -std=c99 -I"/usr/include/pd" -DPD -DVERSION='"0.0"' -fPIC -O6 -funroll-loops -fomit-frame-pointer -Wall -W -g -o "main.o" -c "main.c" -lpng -lbcm2835 -Wno-unused-parameter -Wno-implicit-function-declaration -Wno-unused-variable -Wno-unused-but-set-variable -Wno-comment -lc 

kann mir jemand helfen? Grüße

+0

Wenn es wahr ist, dann ist es wahrscheinlich ein Compiler Bug. Ich denke, es ist besser für Sie, ein komplettes Beispiel für uns bereitzustellen, um Ihren Code zu testen. Das Wichtigste ist, was ist Ihre GCC-Version? – HuStmpHrrr

+0

Erfolgt das auch, wenn Sie den gesamten Code in eine einzige Datei schreiben und eine abgespeckte Befehlszeile verwenden ('cc -std = c99 -pedantic singlefile.c')? – pmg

+0

Was ist Ihre Architektur, Betriebssystem und Version von GCC? Könnten Sie versuchen, unnötige Argumente zum Compiler zu entfernen und Ihren Code auf eine einzelne Datei zu vereinfachen und das Ganze hier zu veröffentlichen, damit andere das Problem reproduzieren können? (Ich habe versucht, es zu reproduzieren und bekam die erwartete Ausgabe.) Zeigen Sie auch die Befehle, die das vollständige Programm kompilieren, gerade jetzt kompilieren Sie nur main.o, aber Sie zeigen nicht, wie Sie die endgültige ausführbare Datei erstellt haben. –

Antwort

4

Sieht aus wie Sie die -Wall Argument für den Compiler fehlt. Damit würden Sie eine Meldung wie sehen:

main.c:3:1: warning: implicit declaration of function ‘wtf’ [-Wimplicit-function-declaration] 

die Art-of Sie das Problem erzählt - wenn Sie nicht eine Funktion in einer Übersetzungseinheit deklarieren, bevor Sie versuchen, es zu nennen, wird der Compiler übernehmen dass es int zurückgibt - und in diesem Fall sieht es so aus, als ob ein int Rückgabewert an der gleichen Stelle (wahrscheinlich ein bestimmtes ganzzahliges Register) als erstes Argument gespeichert wird. Um den Rückgabewert zu erhalten, den die Funktion eigentlich versucht hat (wahrscheinlich in einem Gleitkommaregister), konvertiert sie das int in Float, wie Sie sehen.

+1

aber ich erklärte es in test.h als "float wtf (int c);" Ich habe -Wno-implizite-Funktion-Deklaration verwendet, so dass Sie genau dort sind kommt die Warnung, aber ich sehe nicht, was ich dagegen tun kann – fdsfdsfdsfds

+1

Haben Sie test.h in der Nähe der Spitze von main.c? Ich schlage vor, Ihren Code zu vereinfachen, damit er in eine einzige Datei passt und den vollständigen Code veröffentlicht. –

+0

deklariert es in 'test.h' nicht gut, es sei denn, Sie' #include "test.h" 'in' main.c' - Sie müssen die Deklaration sichtbar * in * der Kompilierungseinheit, bevor Sie es aufrufen. –