Funktion mit Funktionszeiger als Parameter

OP #1062307
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
Persönliche Seite #1062420
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).
OP #1062457
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren