Ich arbeite an einigen Aufgaben für meinen Linux-Kurs, und eine dieser Aufgaben lehrt uns über die Verwendung von Makefiles. Ich habe es geschafft, das von mir erstellte Makefile richtig funktionieren zu lassen, also mach dir keine Sorgen, du entziehst mir nicht das Wissen. Das heißt, ich bin verblüfft über das Verhalten meines Programms.c mehrere Quelldateien geben schlechten Wert zurück
Ich benutze das Makefile, um 4 Quelldateien in einem Programm zu kompilieren. 3 Quelldateien bestehen aus einer einzigen Funktion, die im Wesentlichen nur die Standardfunktionen in math.h verwendet, um eine Berechnung durchzuführen und ein Doppel zurückzugeben. zB:
#include <math.h>
double sqroot(double arg)
{
arg = (sqrt(arg));
return arg;
}
Eine Quelldatei ruft alle drei dieser Funktionen auf.
#include <math.h>
double sum(double arg)
{
arg = (sqroot(arg) + square(arg) + sine(arg));
return arg;
}
Der Haupt ist wie folgt:
#include <stdio.h>
void main(int argc, char *argv[])
{
double num=atoi(argv[1]);
printf("the sine of %lf in radians is %lf\n", num, (sine(num)));
printf("the square root of %lf is %lf\n", num, sqroot(num));
printf("the square of %lf is %lf\n", num, square(num));
printf("the sum of all of these is %lf\n", sum(num));
}
Das Programm ohne Probleme kompiliert, aber wenn ich das Programm ausführen, druckt es schlechte Werte.
Mit GDB habe ich den Wert der Rückgabevariable für jede Funktion überprüft, die korrekt sind, aber nach dem Einstieg in die Hauptversion ist der Wert nicht derselbe. Wenn ich diese Funktionen einfach mit Konstruktoren in den main lege, funktioniert das Programm wie erwartet.
Probe Terminal-Ausgabe:
eng-svr-1:/home/jhazel/Desktop/Linux/257/hw8>make all
gcc -c main.c sine.c sqrt.c square.c sum.c -lm
gcc -o HEYTHERE main.o sine.o sqrt.o square.o sum.o -lm
gcc -g main.c sine.c sqrt.c square.c sum.c -lm
eng-svr-1:/home/jhazel/Desktop/Linux/257/hw8>./HEYTHERE 2
the sine of 2.000000 in radians is 0.000000
the square root of 2.000000 is 0.000000
the square of 2.000000 is 0.000000
the sum of all of these is 0.000000
eng-svr-1:/home/jhazel/Desktop/Linux/257/hw8>
Habe ich falsch mein Make-Datei konstruieren? mit einem falschen Befehl kompilieren? oder fehle ich etwas in meinen Quelldateien?
'doppelte Zahl = atoi (argv [1]);' nicht schlecht, aber riecht. Warum nicht 'atof()' benutzen? – MikeCAT
Aktivieren Sie Compilerwarnungen, indem Sie die Option '-Wall -Wextra' hinzufügen. Sie müssen Ihre Funktionen angeben, bevor Sie sie verwenden. – MikeCAT
'atoi()' war übrig geblieben von einem vorherigen Fehler, in Eile verwendet int Funktionen, weil ich nicht aufgepasst habe. '-Wall -Wextra' half mir, das Problem zu identifizieren, ich habe eine Header-Datei zur Korrektur eingefügt. –