2016-11-23 3 views
0

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?

+0

'doppelte Zahl = atoi (argv [1]);' nicht schlecht, aber riecht. Warum nicht 'atof()' benutzen? – MikeCAT

+6

Aktivieren Sie Compilerwarnungen, indem Sie die Option '-Wall -Wextra' hinzufügen. Sie müssen Ihre Funktionen angeben, bevor Sie sie verwenden. – MikeCAT

+0

'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. –

Antwort

0

Dank MikeCats Vorschlag, in meinem Makefile -Wall -Wextra zu verwenden, konnte ich feststellen, dass ich keine Deklarationen für die in den anderen Quelldateien implementierten Funktionen enthalten hatte.

Um das Problem zu beheben, enthalten ich eine Header-Datei mit Erklärungen:

double square(double arg); 
double sine(double arg); 
double sqroot(double arg); 

auf die Summe und Hauptquelldateien und zusätzlich double sum(double arg); zum Haupt.

+0

Nur um klar zu sein, das ist kein Konstrukteur. Ein Konstruktor ist etwas ganz anderes. Das ist eine Funktionsdeklaration. – MadScientist

Verwandte Themen