www.mikrocontroller.net

Forum: PC-Programmierung Zugriff auf Function Pointer


Autor: Jan Welzien (abitent)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moinsen!

Erklärung meines Problems findet sich im code-schnipsel:


// Haupt-Struct indem alle wichtigen Variablen vorhanden sein sollen.
typedef struct
{
  ...
  void *pointer; //statt void hätte ich lieber t_base, das wäre 
allerdings ein Zirkelbezug der ersten typedef...
  ...
}t_base;

// Pointer auf Funktionen
typedef void (*fp)(t_base *);

// Tabelle
typedef struct
{
  const char *str;
  fp funktionspointer;
}t_table;

void function(t_base *pbase)
{
  // hier passiert irgendwas...
}

void aux(t_base *pbase)
{
  // !! Hier ist es für mich interessant.
  // ich möchte über base die Funktion "function" starten
  // so geht es nicht:
  pbase->pointer[0]->function(base);
  // so auch nicht:
  pbase->pointer[0].function(base);
  // Wie geht es richtig?
}

void main(void)
{
  t_base base, *pbase = &base;
  t_table table[] =
  {
    {"string1", function },
    {"", 0}
  }

  pbase->pointer = &table;  // Adresse der Tabelle in base.pointer 
eintragen.

  aux(pbase);
}

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>   void *pointer; //statt void hätte ich lieber t_base, das wäre
> allerdings ein Zirkelbezug der ersten typedef...

Ich gehe davon aus, dass pointer ein Zeiger auf t_table sein soll.
Ich habe dein Programm etwas zurechtgebogen, so dass es zumindest
kompiliert. Ob es das Richtige tut, musst du entscheiden ;-)
struct s_base;                // Hilfskonstruktion, da void-Pointer
typedef struct s_base t_base; // bäh sind und Typedefs nicht vorwärts
                              // deklariert werden werden können

typedef void (*fp)(t_base *);

typedef struct
{
  const char *str;
  fp funktionspointer;
} t_table;

struct s_base
{
  t_table *pointer;
};

void function(t_base *pbase)
{
}

void aux(t_base *pbase)
{
  t_base base;
  pbase->pointer[0].funktionspointer(&base);
}

int main(void)
{
  t_base base, *pbase = &base;
  t_table table[] =
  {
    {"string1", function },
    {"", 0}
  };

  pbase->pointer = table;
  aux(pbase);
  return 0;
}

Auf lange Erklärungen habe ich jetzt keine Lust. Frag einfach nach, an
welchen Stellen du etwas nicht verstanden hast :)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Ich sehe gerade, dass die erste Zeile in meinem Code überflüssig
ist. Sie schadet aber auch nicht.

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.