mikrocontroller.net

Forum: Compiler & IDEs Funktion mit Funktionszeiger als Parameter


Autor: Leo Lion (gogalop27)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sind die Schweinereien, die man mit C machen kann...
int a = ...;
((void(*)(int)) a) (42);

Nimmt einen int und castet ihn zu einem Funktionszeiger wie er definiert 
würe per
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).

Autor: Leo Lion (gogalop27)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.