Forum: Compiler & IDEs Funktionsaufruf mit pgm_read_word


von Hans (Gast)


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
}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Hast du schon versucht einen cast einzufügen, so wie du es bei den 
Argumenten auch gemacht hast? Der Compiler muss ja wissen, dass das 
"word" ein Funktionspointer sein soll...
1
    ((void (*))pgm_read_word(&entry->select))
2
                  (
3
                     (uint8_t *)pgm_read_word(&entry->value), 
4
                     (char *)pgm_read_word(&entry->name)
5
                  );

  

von Oliver (Gast)


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

von Hans (Gast)


Lesenswert?

Danke Oliver,

dein Vorschlag funktioniert tadellos!

Hans

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.