2015-07-10 13 views
5

Ho il seguente struct costante che detiene i puntatori a funzione:Come rendere i puntatori di funzione in una costante di struttura da utilizzare per inizializzare un array costante?

/* module1.h */ 

typedef struct my_struct my_struct_t; 

struct my_struct 
{ 
    void (*funcPtr1)(void); 
    void (*funcPtr2)(void); 
} 

extern const my_struct_t myStruct1; 



/* module1.c */ 

#include <module1.h> 

static void func1(void) 
{ 
    // do something 
} 

static void func2(void) 
{ 
    // do something else 
} 

const my_struct_t myStruct1 = { 
    .funcPtr1 = &func1, 
    .funcPtr2 = &func2 
} 

Fin qui tutto bene!

Ora voglio creare un array costante del struct sopra e assegnare i puntatori a funzione dalle istanze della struct:

/* module2.c */ 

#include <module1.h> 

const my_struct_t arrayOfMyStruct[] = { 
    { myStruct1.funcPtr1, myStruct1.funcPtr2 }, 
    // ... 
} 

compilatore genera un errore e dice, che le espressioni "myStruct1.funcPtr1" e "myStruct1.funcPtr2" non erano costanti .
Cosa c'è che non va?

+0

sei sicuro che è incluso. Per includere il file locale '#include" module1.h "'. – Jeyaram

+0

È sicuramente incluso. – momjovi89

+0

Questo non è un problema relativo ai puntatori di funzione, ma un problema relativo all'inalizzazione delle variabili in generale. – alk

risposta

2

myStruct1 viene dichiarato con il qualificatore const, ma non è costante. L'inizializzazione statica richiede che sia, e arrayOfMyStruct ha una durata di archiviazione statica.

Tutte le espressioni in un inizializzatore per un oggetto con durata di memorizzazione statica o di thread devono essere espressioni costanti o stringhe letterali.

È possibile inizializzare esso utilizzando direttamente le funzioni: { func1, func2 },

o prendere l'indirizzo del puntatore: { &myStruct1.funcPtr1, &myStruct1.funcPtr2 },

nel qual caso si dovrà utilizzare un diverso tipo struct per la matrice:

typedef struct 
{ 
    void (*const *funcPtr1)(void); 
    void (*const *funcPtr2)(void); 
} my_struct2_t; 

e la sintassi per chiamare la funzione deve essere cambiato:

(*arrayOfMyStruct[0].funcPtr2)(); 
+1

La prima soluzione non è possibile nella mia applicazione. In effetti il ​​tipo di array in module2.c è di un altro tipo ma contiene gli stessi tipi di puntatore di funzione, quindi ho usato lo stesso per spiegare il problema. Con la seconda soluzione intendi che devo cambiare la struct per module2.c in quel modo che gestisce un "puntatore a un puntatore di funzione", giusto? Ma non voglio cambiarlo in realtà. Non esiste un modo per rendere costante "myStruct1.funcPtr1" ?? – momjovi89

+1

@ momjovi89 Oltre ai modi sopra elencati. No. – this

Problemi correlati