www.mikrocontroller.net

Forum: PC-Programmierung verstehe typedef nicht


Autor: Christian (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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.