Problem mit Kompilierung unter GCC



  • Hallo User,

    ich habe aus einem Buch ein Programm eingegeben. Jedoch komme ich mit der Fehlermeldung nicht klar.
    Das Programm ist das Eulerverfahren. Das habe ich unter Ubuntuu GCC eingegeben.
    Hier der Code

    #include <stdio.h>
    #include <math.h>
    
    int i,n;
    float anfang, ende, interv, wert, sum_u, sum_o;
    
    double funktion ();
    
    void main ()
    {	
    	printf("Die untere Integrstionsgrenze eingeben: ");
    	scanf("%f",&anfang);
    	printf("Die obere Integrstionsgrenze eingeben: ");
    	scanf("%f",&ende);
    	printf("Geben sie die Anzahl der Intervalle an (max. 3000): ");
    	scanf("%d",&n);
    
    	/*Initialisierung zu Null*/
    	wert = 0.0;
    	sum_u= 0.0;
    	sum_o= 0.0;
    
    	/*Berechnung der Intervallbreite (Breite des Trapez)*/
    	interv = (ende - anfang) / n;
    
    	/*Aufsummierung der einzelnen Intervallflächen für die Obere Fläche und die Untere Fläche*/
    	for (i=0; i<=n; i++)
    	{
    		sum_u = sum_u + funktion(anfang + i*interv)*interv;
    		sum_o = sum_o + funktion(anfang + (i+1)*interv)*interv;
    	}
    
    	/*Berechnung der "wahren" Fläche durch Mittelung der beiden Flächen*/
    	wert=(sum_u+sum_o)/2;
    	printf("Das Integral in den obigen Grenzen hat den Wert %f \n",wert);
    
    	/*Definition der benutzten Funktion*/
    
    double funktion (double x)
    {
    	return(exp (-x*x));
    }
    }
    

    und die Meldung.

    torsten@ubuntu:~/Dokumente$ gcc euler.c -lm
    /tmp/ccn5WWdF.o: In function `main':
    euler.c:(.text+0xea): undefined reference to `funktion'
    euler.c:(.text+0x136): undefined reference to `funktion'
    collect2: ld gab 1 als Ende-Status zurück
    

    Kann mir da jemand bitte helfen?
    Ich bin erst in Kapitel 4 von 7 🙂

    Gruß und danke für die Antworten



  • Ist das „Jetzt lerne ich C“? Laut google books hast du das Programm falsch abgeschrieben, indem du die Definition der Funktion ‚funktion‘ in den Körper der main-Funktion reingeschrieben hast. Die gehört nach außen. Nach die main-Funktion.

    Verschachtelte Funktionen gibt es in C nicht, alle Funktionen stehen nebeneinander. Manche Compiler unterstützen das zwar (der gcc z.B., deshalb bekommst du auch keine Fehlermeldung dafür), aber das ist halt kein ANSI-C.

    Und noch was ... das Programm ist nicht gerade ein Musterbeispiel für guten Code. Wenn die Beispiele in dem Buch alle von dieser „Qualität“ sind, solltest du es durch ein anderes ersetzen.

    Und “Made by Mad Doc Riedel” ... sehr professionell 😃



  • In C gibt es keine funktionlokalen Funktionen.
    Funktionen sind immer (modul-)global definiert.

    Die Klammer } aus Zeile 44 gehört in Zeile 37.

    Und main gibt ein int zurück. Darum heißt es int main() und vor Zeile 37 kommt ein return 0;

    Aus welchem Buch ist denn das Beispiel?



  • Das Beispiel ist aus dem Buch

    "Jetzt lerne ich C"



  • Immer mit Warnungen kompilieren!

    gcc -Wall -Wextra -pedantic -ansi euler.c -lm
    


  • DirkB schrieb:

    [...] und vor Zeile 37 kommt ein return 0;

    Wie lang' müssma sowas noch verbreiten?
    Gibt main() nichts zurück, so wird implizit 0 zurückgegeben. Wenn schon selbst machen, dann bitte EXIT_SUCCESS oder EXIT_FAILURE ...


  • Mod

    Swordfish schrieb:

    DirkB schrieb:

    [...] und vor Zeile 37 kommt ein return 0;

    Wie lang' müssma sowas noch verbreiten?

    Solange ein gewisser bekannter Softwarehersteller einen C-Compiler verbreitet, der nur C89 kann. Also für immer.



  • DAS kan sogar der cl...



  • bei void main() schreibt man aber kein return 0 und wenn man im funktionsprototyp double funktion() schreibt, kann man in der funktionsdefinition nicht double funktion(double x) schreiben. das buch ist wirklich scheiße!



  • meiers schrieb:

    bei void main() schreibt man aber kein return 0 und wenn man im funktionsprototyp double funktion() schreibt, kann man in der funktionsdefinition nicht double funktion(double x) schreiben. das buch ist wirklich scheiße!

    1. Da void main() nicht gültig ist, ist diese Anmerkung unnötig
    2. In C89 bedeuten leere Klammern beim Prototyp, dass die Anzahl der Argumente beliebig ist. Also passt der Prototyp sehr wohl zur Definition.

    Das heißt nicht, dass das Buch nicht scheiße ist. Leere Klammern beim Prototyp sind soooo archaisch, da könnte man ruhig was moderneres lehren.


Anmelden zum Antworten