Forum: PC-Programmierung Zugriff auf Function Pointer


von Jan W. (abitent)


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);
}

von yalu (Gast)


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 :)

von yalu (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.