2015-07-10 20 views
5

Mam następujący struct, która utrzymuje stałą wskaźników funkcji:Jak utworzyć wskaźniki funkcji w stałej struktury do użycia w celu zainicjowania stałej tablicy?

/* 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 
} 

tej pory tak dobrze!

Teraz chcę utworzyć stałą tablicę powyższej struktury i przypisanie wskaźników funkcji z wystąpień struct:

/* module2.c */ 

#include <module1.h> 

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

kompilator wygeneruje błąd i mówi, że wyrażenia "myStruct1.funcPtr1" i "myStruct1.funcPtr2" nie były stałe .
Co jest nie tak?

+0

Czy na pewno dołączono ? Do włączenia lokalnego pliku '#include" moduł1.h "'. – Jeyaram

+0

Jest na pewno dołączony. – momjovi89

+0

To nie jest kwestia związana z wskaźnikami funkcyjnymi, ale kwestia związana z zainicjowaniem zmiennych w ogóle. – alk

Odpowiedz

2

myStruct1 jest zadeklarowany z kwalifikatorem const, ale nie jest stały. Wymagana jest inicjalizacja statyczna, a arrayOfMyStruct ma czas przechowywania statycznego.

Wszystkie wyrażenia do inicjowania dla obiektu, który ma statyczną lub przechowywania wątek trwania powinna być stała lub wyrażenia literały ciągów znaków.

można zainicjować za pomocą bezpośrednio funkcje: { func1, func2 },

lub wziąć adres wskaźnika: { &myStruct1.funcPtr1, &myStruct1.funcPtr2 },

w takim przypadku trzeba będzie użyć innego typu struct do tablicy:

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

i składnia do wywoływania funkcji musi być zmieniony:

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

Pierwsze rozwiązanie nie jest możliwe w mojej aplikacji. W rzeczywistości typ tablicy w module2.c jest innym typem, ale posiada te same typy wskaźników funkcji, więc użyłem tego samego do wyjaśnienia problemu. Przez drugie rozwiązanie masz na myśli to, że muszę zmienić strukturę dla modułu2.c w ten sposób, że obsługuje on "wskaźnik do wskaźnika funkcji", prawda? Ale nie chcę tego zmieniać. Czy nie ma sposobu, aby stała "myStruct1.funcPtr1" stała? – momjovi89

+1

@ momjovi89 Oprócz sposobów wymienionych powyżej. Nie. – this