Zugriff auf Function Pointer

#1424973
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);
}
Gast #1425029
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 ;-)
1
struct s_base;                // Hilfskonstruktion, da void-Pointer
2
typedef struct s_base t_base; // bäh sind und Typedefs nicht vorwärts
3
                              // deklariert werden werden können
4

5
typedef void (*fp)(t_base *);
6

7
typedef struct
8
{
9
  const char *str;
10
  fp funktionspointer;
11
} t_table;
12

13
struct s_base
14
{
15
  t_table *pointer;
16
};
17

18
void function(t_base *pbase)
19
{
20
}
21

22
void aux(t_base *pbase)
23
{
24
  t_base base;
25
  pbase->pointer[0].funktionspointer(&base);
26
}
27

28
int main(void)
29
{
30
  t_base base, *pbase = &base;
31
  t_table table[] =
32
  {
33
    {"string1", function },
34
    {"", 0}
35
  };
36

37
  pbase->pointer = table;
38
  aux(pbase);
39
  return 0;
40
}

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren