Forward einer typedef struct für Funktionsargument?

17/12/2009 - 11:22 von Leo Meyer | Report spam
Hallo,

in einem avr-gcc-Programm habe ich folgende Deklarationen:

typedef void (*MENU_SELECTED_FN)(void *);

typedef struct menu_item_s {
struct menu_item_s *next; // pointer to next item, may be NULL
MENU_SELECTED_FN sel_fn; // function called when the menu is selected, may be NULL
...
} MENU_ITEM;

Die Selektionsfunktionen bekommen das MENU_ITEM als Parameter:

void menu_sel_beep(MENU_ITEM *item) {
...
}

Es werden dann Variablen initialisiert, z.B.

MENU_ITEM menu_beep PROGMEM = {
&menu_delay,
&menu_sel_beep, // warning: initialization from incompatible pointer type
...
};

Der Code làuft (im Simulator wenigstens).
Mein Problem ist die warning: "initialization from incompatible pointer type".
Was ich gerne möchte, ist ein Funktionstyp

typedef void (*MENU_SELECTED_FN)(MENU_ITEM *);

Das würde dann wohl die Warnung erledigen.

Es gelingt mir allerdings mit meinen beschrànkten C-Kenntnissen nicht, eine funktionierende
Lösung dafür auszuhirnen. Ich dachte an einen Forward, etwa:

typedef struct MENU_ITEM;

um den Typ des Funktionsarguments vorab festzulegen (statt void *). Geht leider so nicht.

Weiß jemand eine Möglichkeit, die làstigen Warnings loszuwerden oder muss ich damit leben?
-Wall möchte ich weiterhin verwenden.

TIA, Leo

Swearwords are dung for the day.
 

Lesen sie die antworten

#1 Thomas Rachel
17/12/2009 - 12:18 | Warnen spam
Leo Meyer schrieb:

Was ich gerne möchte, ist ein Funktionstyp

typedef void (*MENU_SELECTED_FN)(MENU_ITEM *);

Das würde dann wohl die Warnung erledigen.



Dann tu doch das - Du kannst diese Deklaration ja nach dem typedef
plazieren.

Sollte das nicht gehen, blieben noch folgende Möglichkeiten:

1.
typedef struct menu_item_s MENU_ITEM;
typedef void (*MENU_SELECTED_FN)(MENU_ITEM *);

2.
typedef void (*MENU_SELECTED_FN)(struct menu_item_s *);


Thomas

Ähnliche fragen