1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

funktionen nur mit #include?

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Gogul, 08.10.06.

  1. Gogul

    Gogul Uelzener Rambour

    Dabei seit:
    21.05.04
    Beiträge:
    372
    Servus!

    In meinem C-Buch zum Studium steht folgendes Beispiel:

    Code:
    #include <stdio.h>
    
    double pow();
    
    int main()
    {
    	double x=3.0,y;
    	
    	y=pow(x,3.0);
    	
    	printf("3 hoch 3 ergibt: %f",y);
    	
    	return 0;
    	
    }
    Was dann folgende Fehlermeldung ausspruckt:

    3: error: too many arguments to function 'double pow()'

    Ich habs dann mit
    Code:
    double pow(double, double);
    probiert, womit ich zwar keinen fehler mehr bekomm, dafür das:

    ZeroLink: unknown symbol '__Z3powdd'

    test has exited due to signal 6 (SIGABRT).


    dann hab ich weiter hinten im Buch gelesen das die Funktion schon in math.h definiert ist, also
    Code:
    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
    	double x=3.0,y;
    	y=pow(x,3.0);
    	printf("3 hoch 3 ergibt: %f",y);
    	
    	return 0;
    	
    }
    Das gibt dann das erwünsche Ergebniss aus! Aber warum funktionieren es nicht ohne include? in der math.h steht ja auch nur:
    Code:
    extern double pow ( double, double );
    vielen dank!
     
  2. pi26

    pi26 Adams Parmäne

    Dabei seit:
    17.12.04
    Beiträge:
    1.297
    Weil in math.h zwar die Deklaration steht, die du simuliert hast. Aber zudem (quasi) in math.c die zu dieser Deklaration gehörende Implementation (sprich das Programm pow)...


    mfg pi26
     
  3. Gogul

    Gogul Uelzener Rambour

    Dabei seit:
    21.05.04
    Beiträge:
    372
    hmm was auch ncoh funktioniert (steht im anhang drinn) ist:

    Code:
    #include <stdio.h>
    double pow(double x, double y);
    int main()
    {
    	printf("3 hoch 3 ergibt: %f",pow(3,3));
    	
    	return 0;
    	
    }
    dann müsst doch die funktion schon in stdio.h definiert sein? *vollverwiert*
     
  4. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.255
    Nein, da wird idiotischerweise nach dem Include "pow" definiert. Da pow aber eine Funktion der Standard Library ist sollte man den dazu passenden Header (math.h) inkludieren. Die Standard Library wird automatisch zu Deinem Programm gelinkt, bei anderen Libraries ist das nicht der Fall.
     
  5. Gogul

    Gogul Uelzener Rambour

    Dabei seit:
    21.05.04
    Beiträge:
    372
    Ich habs zwar nicht ganz verstanden, aber ich akzeptier das einfach mal so;)

    danke für die Mühe!
     
  6. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.255
    Die Standard Library (übersetzt sich zu Norm Bibliothek) ist Teil der Programmiersprache C, beides wird in der ISO Norm 9899 definiert. Die Standard Library wird auf Computer automatisch zu einem Programm gelinkt. Eine Library (Bibliothek) ist eine Sammlung von Funktionen, die irgend jemand vorher schon übersetzt hat, und diese liegen nun in einer binären Form vor.

    Man unterscheidet zwischen Deklaration und Definition, bei ersten wird der Name einer Funktion und die Parameter nur bekannt gemacht, bei letzteren wird sie implementiert (der Programmcode steht da).

    Wenn Du eine Funktion einer Bibliothek verwenden willst, dann mußt Du Deinem Programm diese Funktion bekannt machen. Dies macht man in dem man die zur Bibliothek passende Header-Datei inkludiert. Dies geschieht mit der Präprozessordirektive #include <> oder #include "", ersteres benutzt man, wenn die Header-Datei in einem Systemverzeichnis liegt (also auch für die Standard Library Header) und die letztere Form für Projekt spezifische Includes.

    Was an den von Dir zitierten Programmcode sehr unschön ist, daß da jemand auf das Laden des richtigen Headers verzichtet und brutal die Funktion pow selbst deklariert. So etwas macht man nicht, da dies als fehlerträchtig und unsauber gilt.

    Damit Du sieht was falsch ist, die korrigierte Version des Programms.
    Code:
    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
    	printf("3 hoch 3 ergibt: %f",pow(3,3));
    	
    	return 0;
    	
    }
     
  7. Gogul

    Gogul Uelzener Rambour

    Dabei seit:
    21.05.04
    Beiträge:
    372
    ok danke, ich denk jetzt hab ich es kapiert!
     

Diese Seite empfehlen