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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.