Forum: Compiler & IDEs Function Pointer aus Struct im Flash aufrufen


von Marcus (Gast)


Lesenswert?

Hallo,

obwohl ich jetzt die Suche schon stark emüht habe, komme ich leider an 
einer Stelle nicht weiter.
Ich habe in der Array menu eine Funktion hinterlegt und möchte diese nun 
aufrufen. Wie schaffe gelingt es die im Flash gespeicherte Adresse an 
einen Funktionspointer zu übergeben bzw. einen Funktionspointer daraus 
zu generieren. Die Textausgabe funktioniert ohne Probleme.

Danke

gruß Marcus
1
typedef void (*VoidFnct)(int);
2
3
global menu_posing; // wird von Interrupts manipuliert
4
5
typedef struct { // Structure fürs Menü
6
  const char *text;
7
 [...]
8
  VoidFnct function;
9
} MENU_ENTRY ;
10
11
const MENU_ENTRY menue[] PROGMEM= { // Menü array
12
[...]
13
  { menu_str_1, 0,10, 3, 1, start_child},//2
14
[...]
15
};
16
17
void start_child (int menu_posing) { // diese Soll jetzt nun den Text
18
  lcd_clear();                // ausgeben und die Funktion aufrufen
19
  help_ptr = pgm_read_word(&(menue[menu_posing].text));
20
  lcd_string_p(help_ptr);
21
22
// Hier ist das Problem!
23
        (pgm_read_word(&(menue[menu_posing].function)))(menu_posing);
24
25
}

von Marcus (Gast)


Lesenswert?

Hat sich erledigt!

Diese Codeschnipsel hat die Lösung gebracht, für den Fall das jemand 
dieses Problem auch haben mag.
1
  
2
((VoidFnct)(pgm_read_word(&(menue[menu_posing].function))))(menu_posing);

Gruß Marcus

von Timmo H. (masterfx)


Lesenswert?

Ich habe mal eine Debug-Console programmiert. Da sah es etwa so aus:
1
typedef void generic_f (char argc, char *argv); 
2
3
typedef struct {
4
  char        *nptr;     /* Name der Funktion */
5
  generic_f   *fptr;     /* Funktionspointer */
6
  char        *syntax;   /* Syntax */
7
}commandtable;
8
9
10
const commandtable f[] = {
11
      {"help ...... Hilfe ausgeben\n",cmd_help,"help\n"},
12
      {"dump ...... Memory Dump\n",cmd_dump,"dump <addr>\n"},
13
14
   //usw.
15
16
};
17
18
/* Wird aufgerufen wenn String+\n empfagen wurde 
19
   cmdptr ist der Pointer auf das eingegebene commando */
20
void call_cmd(char *cmdptr){
21
  char cmd_pos, arguments, cmd_length;
22
  /* Auf gültigkeit prüfen. Wenn Commando erkannt 
23
     Position in commandtable zurückgeben */
24
  cmd_pos = is_cmd(cmdptr);  
25
  if(cmd_pos == -1) 
26
     printf("Kommando nicht gefunden\n");
27
  else{
28
     argc = count_arg(cmdptr, &cmd_length);
29
     arguments = cmdptr+cmd_length+1;     /* command + offset = args */
30
     (f[cmd_pos].fptr)(argc,arguments);    /* Funktion aufrufen */
31
   }
32
}
Ist jetzt nicht ganz vollständig, aber so in etwa gehts. Vorallen recht 
flexibel werden variabler Anzahl von Argumenten usw.

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.