Forum: Compiler & IDEs Funktion mit Funktionszeiger als Parameter


von Leo L. (gogalop27)


Lesenswert?

Hallo zusammen,

ich bin ein absoluter Neuling in C++.  Ich habe gerade eine Frage bzgl. 
Funktionszeiger.

Kurz und unkompliziert gefragt:

void plot(double (*fp)())
{
....
}


void main(void)
{
plot(sin);
plot(cos);
}


Im ersten Programmstück ist eine Funktion namens plot, die als Parameter 
einen Funktionszeiger erwartet.  Meine Frage:
Warum ist "sin" bzw. "cos" als Funktionszeiger zu betrachten (siehe 
bitte die main-Funktion)?
"sin" bzw. "cos" sind doch ganz normale Funktionen, sie sind keine 
Funktionszeiger.  Warum geht also plot(sin) ?

Vielen Dank für Eure Hile.

Grüße aus Rheinland,

Leoni

von Simon K. (simon) Benutzerseite


Lesenswert?

Weil eben der Funktionsname ohne Argumentenklammern die Adresse der 
Funktion zurückgibt. Analog zu Arrays, die ohne Indexklammer auch einen 
Zeiger auf das erste Element zurückgeben (können).

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das sind die Schweinereien, die man mit C machen kann...
1
int a = ...;
2
((void(*)(int)) a) (42);

Nimmt einen int und castet ihn zu einem Funktionszeiger wie er definiert 
würe per
1
void a (int);

und ruft diese Funktion mit 42 als Parameter auf.
Ohne Rücksicht auf Verluste.

Um eine Funktion aufrufen zu können bzw einen Aufruf in Code erzeugen zu 
können, braucht ein C/C++-Compiler den Code einer Funktion nicht zu 
kennen, sondern lediglich

1) einen Prototypen, der die Argument/Returnwertübergabe spezifiziert
2) die Startadresse, wobei er diese nicht explizit kennen muss. Diese 
kann ein Symbol sein, daß erst beim Linken festgelegt wird (Regelfall) 
oder in einer Variablen stehen (Funktionspointer).

von Leo L. (gogalop27)


Lesenswert?

Hallo zusammen,

vielen Dank für die rasche Antwort.  Simon K. meinte, dass sin in 
plot(sin) die Adresse von sin ausspucken würde.  Mhh..  ich hab mal 
versucht, dies durch selbstgebasteltes Programm nachzuweisen, hat aber 
nicht geklappt.

#include <iostream>
using namespace std;

double quadrat(double x){
return x*x;
}

int main() {
cout << quadrat << endl;
}

es kam ein Fehler raus beim Kompilieren.  Wisst Ihr vielleicht woran es 
liegt?  Ich hatte erwartet, dass das Programm die Adresse von quadrat 
ausspuckt.  Also, eine Adresse einer Funktion.

Vielen Dank..

Leoni.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

C++ weiß daß quadrat ne Funktion ist und wenn es ohne Parameter da steht 
geht der Compiler wohl von nem Syntaxfehler aus.

Die Meldung wäre hilfreich gewesen.

Versuch's mal mit printf oder den f-Pointer vor der Ausgabe zu casten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.