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 '*' token

    und 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.


Anmelden zum Antworten