verstehe typedef nicht

Gast #1304798
Hallo,
beim Durchlesen eines Quelltextes(C++) bin ich auf folgendes
gestoßen:

in einer Header-Datei werden 2 structs declariert und ein
typedef durchgeführt:

  struct vec{
  ...
  };

  struct situation{
  ...
  };

  typedef vec(value)(situation&);

in einer Implementierungsdatei .c wird dann eine Funktion
Jammer implementiert:

  vec Jammer( situation& s )
  {
   ...
  }
und in einer anderen Datei erscheint mal folgendes:
value Jammer;

Irgendwie verstehe ich denn Sinn des typedef hier nicht.
Kann mir mal einer auf die Sprünge helfen

Mfg
Christian
Christian schrieb:

> Irgendwie verstehe ich denn Sinn des typedef hier nicht.
> Kann mir mal einer auf die Sprünge helfen

  typedef vec(value)(situation&);


Der typedef besagt, dass es einen Datentyp namens value gibt.
Ein 'value' ist eine Funktion die eine Referenz auf situation& als 
Argument akzeptiert und einen vec zurückliefert.


Höchst wahrscheinlich wirst du irgendwo im Programm eine 
Pointer-Variable finden

value* ptrFunc;

Das ist dann ein Funktionspointer. Diesem Pointer kann die Adresse einer 
Funktion zugewiesen werden. zb so


    ptrFunc = Jammer;

und die Funktion dann über den Pointer aufgerufen werden

  situation CurrentSituation;
  vec Result;

  Result = ptrFunc( CurrentSituation );


Soetwas hat man in C gerne gemacht um sog. Callbacks zu realisieren. 
Denk zb an qsort. qsort benötigt neben den eigentlichen Daten auch noch 
eine Funktion, welche für 2 Datenfelder einen Kleiner-Vergleich 
durchführt. Da dieser Vergleich aber vom genauen Aufbau der Daten 
abhängt, kann er nicht in qsort selbst gemacht werden. Daher muss man 
qsort auch noch die Adresse einer Funktion übergeben, welche das 
erledigt.

In C++ kann man die Sache mit Funktionspointern auch weiterhin so 
machen. Allerdings ist es oft vernünftiger, wenn die Callback 
Funktionalität über ein Interface eingefordert wird.

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.