Forum: PC-Programmierung const func pointer in struct init


von Juergen G. (jup)


Lesenswert?

Ich entschuldige mich gleich mal vorweg, dass ich nach den 20 gelesenen 
Threads nicht alle anderen xxxx Posts zu Pointern und dergleichen lesen 
mag und einfach nochmal meine Frage dazu stelle.

Die C Gurus hier koennen mir sicher auf Anhieb sagen wo mein Fehler ist.

Folgender Code Auszug:
1
#define  ST_Profile_Select  10
2
#define  ST_Show_Rev    12
3
4
5
typedef struct {
6
  const uint8_t state;
7
  const char *pText;
8
  const uint16_t (*pFunc)(int16_t input);
9
} MENU_STATE_t;
10
11
12
uint16_t on_ST_Profile_Select(int16_t input);
13
uint16_t on_ST_Show_Rev(int16_t input);
14
15
const MENU_STATE_t menu_state[] = {
16
17
  { ST_Profile_Select,   NULL,     on_ST_Profile_Select },
18
  { ST_Show_Rev,     NULL,     on_ST_Show_Rev }
19
}

compiliert mit

Invoking: GCC C Compiler
gcc -O3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/sss.d" 
-MT"src/sss.d" -o "src/sss.o" "../src/sss.c"

meint der compiler


../src/sss.c:31:2: warning: initialization from incompatible pointer 
type [enabled by default]
../src/sss.c:31:2: warning: (near initialization for 
‘menu_state[0].pFunc’) [enabled by default]

Was fehlt da im Code das der Compiler nicht mehr noergelt?

Danke

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

1
   const uint16_t (*pFunc)(int16_t input);

Das Problem wird sein, daß sich das const hier auf den Rückgabewert, 
nicht aber auf den Funktionspointer bezieht.

Die Syntax für Funktionspointer ist, äh, gewöhnungsbedürftig.

Abhilfe sollte hier die Verwendung eines typedef schaffen:
1
typedef uint16_t (*FUNCPOINTERTYPE)(int16_t input);
2
3
typedef struct {
4
  const uint8_t state;
5
  const char *pText;
6
  const FUNCPOINTERTYPE pFunc;
7
} MENU_STATE_t;


Hilfts?

von Juergen G. (jup)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Hilfts?

Ja, Deine Medizin hat den Compiler beruhigt.

Tausend Dank an Rufus

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.