Funktionsaufruf mit pgm_read_word

Gast #549998
Lesenswert?
• ▲
▼
Hallo,

ich versuche verzweifelt mit Hilfe von pgm_read_word eine Funktion 
aufzurufen. Jedoch scheitere ich am Syntax. Wer kann mir weiterhelfen? 
Ohne Verwendung von PROGMEM lautete die zu ändernde Zeile (siehe unten) 
folgend:

entry->select((uint8_t *)entry->value, entry->name);
1
typedef struct menu_entry_s {
2
  uint8_t flags;                             
3
  void (*select)(uint8_t *value, char *name);  // Funktionsaufruf
4
  char name[12];           
5
  void *value;                               
6
} PROGMEM menu_entry_t;
7

8

9
void menu_select(menu_context_t *context)
10
{
11
  menu_entry_t *entry;
12

13
  entry = &((*(context->menu->entry))[context->menu->current_entry]);
14

15
  if (pgm_read_byte(&entry->flags) & MENU_FLAG_SUBMENU) {
16
  
17
    menu_enter(context, (menu_t *)pgm_read_word(&entry->value));
18
  } else {
19
    
20
          
21
    pgm_read_word(&entry->select) //<== Hier muss noch etwas umgebogen werden
22
                 (
23
                     (uint8_t *)pgm_read_word(&entry->value), 
24
                     (char *)pgm_read_word(&entry->name)
25
                  );
26
  }
27
  
28
}
Gast #550093
Lesenswert?
• ▲
▼
Nächste Runde :-)

ich würde mir erst den Pointer auf die Funktion holen, und die dann 
aufrufen.

Etwa so:
1
void (*pFunc)(uint8_t *value, char *name) = 
2
             (PGM_VOID_P) pgm_read_word(&entry->select);
3

4
pFunc((uint8_t *)pgm_read_word(&entry->value), 
5
      (char *)pgm_read_word(&entry->name));

Allerdings vermute ich mal, daß da in den Zeilen vorher schon einiges 
durcheinander geht. Mach dir nochmal klar, welche der Daten im Flash 
liegen.

Oliver

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