verschachtelte Syntaxfrage
-
Hi, ich hab hier mal nen paar Syntaxfragen.
hier:
typedef struct { int (*pMenProc) (MenuItem *); int (*pMenShow) (MenuItem *); } MenuItem;
Die Funktionspointer sollten auf eine Funktion zeigen, die als Argument einen Zeiger auf ein Objekt von dem Strukt haben soll.
SO kommt allerdings ein Error:
main.c parse error before '*' tokenund dann noch eine Frage zu Strings:
char *string = "Test"; string = "Blubb";
wieso muss ich da nicht *string = "Blubb"; schreiben ? ich dachte string wäre hier ein Pointer auf das erste Element von dem Char-Array.
Oder liegt das an der Zuweisung mit den "" ?
-
Zu 1.
Das wird wohl so nicht funktionieren. Wieso muss das eigentlich so sein??Zu 2.
string => Adresse im Speicher, z. B. 3657
*string => Wert an der Adresse von string, z. B. 'T'char *string => Deklaration
char *string = "Test" => Deklaration und Definition (oder Zuweisung)Wobei ich sowas:
char *string = "Test"; string = "Blubb";
vermeiden würde.
-
typedef struct Menu_Item MenuItem; typedef struct Menu_Item{ int (*pMenProc) (MenuItem*); int (*pMenShow) (MenuItem*); } MenuItem;
-
Zu 1.: Der Fehler kommt, weil der Typ MenuItem an der Stelle, an der du ihn verwendest, noch nicht bekannt ist. Abhilfe:
typedef struct MenuItem { int (*pMenProc) (struct MenuItem *); int (*pMenShow) (struct MenuItem *); } MenuItem;
(eigentlich der gleiche "Trick" wie bei rekursiven Datenstrukturen wie Listen und Bäumen)
PS: Es ist nicht nötig, dem struct einen besonderen Namen zu geben. Ob das struct oder der typedef gemeint ist, lässt sich immer daran erkennen, ob struct davorsteht oder nicht.
-
das heisst, wenn ich kannd en Typ MenuItem auch nicht in anderen Modulen als Funktions-Argumente verwenden, sondern muss den voher deklarieren ?
menu.h
extern int mProcMainMenu (MenuItem *);
menu.c
int mProcMainMenu (MenuItem *mItem) { /* zeugs */ return 0; }
main.c
#include <stdio.h> #include "menu.h" int main(int argc, char *argv[]) { typedef struct MenuItem{ int (*pMenProc) (struct MenuItem *); int (*pMenShow) (struct MenuItem *); } MenuItem; static MenuItem *mItem; mItem->pMenProc = &mProcMainMenu; mItem->pMenShow = &mShowMainMenu; /* ... zeugs */ return 0; }
weil so bekomm ich ein "menu.h: parse error before '*' token" Fehler O_o
-
c_beginner schrieb:
das heisst, wenn ich kannd en Typ MenuItem auch nicht in anderen Modulen als Funktions-Argumente verwenden, sondern muss den voher deklarieren ?
Ja.
-
AJ schrieb:
Zu 2.
string => Adresse im Speicher, z. B. 3657
*string => Wert an der Adresse von string, z. B. 'T'char *string => Deklaration
char *string = "Test" => Deklaration und Definition (oder Zuweisung)Wobei ich sowas:
char *string = "Test"; string = "Blubb";
vermeiden würde.
Wieso würdest du das vermeiden? Abgesehen davon, dass es sinnlos ist, sehe ich jedoch keinen Grund, dies zu vermeiden: der Speicher wird nicht über die memFunktionen angefordert und muss auch nicht gefreed werden.
Oder habe ich etwas übersehen?
-
gh0st124 schrieb:
Wieso würdest du das vermeiden? Abgesehen davon, dass es sinnlos ist, sehe ich jedoch keinen Grund, dies zu vermeiden: der Speicher wird nicht über die memFunktionen angefordert und muss auch nicht gefreed werden.
Oder habe ich etwas übersehen?
Weil evtl. Speicherleichen zurückbleiben könnten??
-
AJ schrieb:
gh0st124 schrieb:
Wieso würdest du das vermeiden? Abgesehen davon, dass es sinnlos ist, sehe ich jedoch keinen Grund, dies zu vermeiden: der Speicher wird nicht über die memFunktionen angefordert und muss auch nicht gefreed werden.
Oder habe ich etwas übersehen?
Weil evtl. Speicherleichen zurückbleiben könnten??
Wie denn das? "Test" und "Blubb" sind beides Konstanten.
-
@SG1
Ok, vielleicht störts auch nicht beim Programmablauf, aber vom Gefühl her ist es mir zuwider.