• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

funktionen nur mit #include?

Gogul

Uelzener Rambour
Registriert
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!
 

pi26

Adams Parmäne
Registriert
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
 

Gogul

Uelzener Rambour
Registriert
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*
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
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*
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.
 

Gogul

Uelzener Rambour
Registriert
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!
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
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;
	
}
 

Gogul

Uelzener Rambour
Registriert
21.05.04
Beiträge
372
ok danke, ich denk jetzt hab ich es kapiert!