2016-01-03 1 views
1

J'essaie de lire un pointeur de fonction à partir d'une structure stockée dans PROGMEM, puis de passer une valeur (entrée) à la fonction correspondante et d'enregistrer la valeur renvoyée, mais je ne peux pas trouver la syntaxe correcte.Utilisation de Function Pointer de struct dans PROGMEM in C sur Arduino

uint8_t (*pStateFunc) (uint8_t); 
uint8_t input; 
uint8_t nextstate; 

enum MENUSTATES {STATE1, STATE2}; 

typedef struct PROGMEM { 
    unsigned char state; 
    uint16_t someNumber; // Just arbitrary information 
    uint8_t (*pFunc) (uint8_t input); 
} MENU_STATE; 

const MENU_STATE menu_state[] PROGMEM = { 
    // state someNumber pFunc 
    {STATE1, 2,   NULL}, 
    {STATE2, 4,   doSomething}, 
    {0,  0,   NULL} 
    }; 


// Get the Function 
pStateFunc = (PGM_VOID_P) pgm_read_byte(&menu_state[1].pFunc); 

// Execute the Function and save the returned state 
nextstate = pStateFunc(input); 

// Function Definition 
uint8_t doSomething(u8int_t input){ 
    return STATE1; 
} 

Tout ce que je reçois est l'erreur suivante de l'Arduino IDE 1.6.5:

invalid conversion from 'const void*' to 'uint8_t (*)(uint8_t) {aka unsigned char (*)(unsigned char)}' [-fpermissive] 

Comment puis-je lire la fonction de PROGMEM et l'exécuter correctement?

+0

Quel est ce 'pStateFunc = (PGM_VOID_P) pgm_read_byte (& menu_state [1] .pFunc)' censé faire? – alk

+0

L'initialiseur de 'menu_state []' semble manquer une accolade fermante ('}'). – alk

+0

Il doit lire le pointeur 'doSomething' dans le progmem' menu_state'struct. J'ai ajouté l'accolade manquante ... désolé j'ai oublié ça avant. –

Répondre

0

Vous semblez lire un octet - j'aurais pensé que pgm_read_ptr serait plus approprié. Et vous devez jeter le bon type:

typedef uint8_t (*StateFunc) (uint8_t); 
pStateFunc = (StateFunc) pgm_read_ptr(&menu_state[1].pFunc); 
+0

Ça l'a fait! Merci pour votre aide! –