Wie struct mit konstanter Arraygröße?



  • Hallo zusammen,

    ich habe eine Datenstruktur geschrieben, welches aktuell einen binären Baum speichert, aber schnell auf n Kinder erweitert werden soll.

    static const int CHILDREN_CNT = 2;
    //#define CHILDREN 2;
    
    typedef struct _knot {
    struct knot *children[CHILDREN_CNT];
    int value;
    } knot;
    

    Leider mag der Compiler keine Variable als Arrayangabe, obwohl es const ist und auch ein #define führt nicht zum Ziel. Wie setze ich es um, dass ich bei einer Änderung nur die Konstante anpassen muss?

    Vielen Dank im Voraus, Norbert



  • typedef struct _knot {
    struct knot *children
           ^--- compiler: "hä? was ist das? kenne nur struct _knot."
    


  • Danke oneone, ich habe es wohl zu knapp beschrieben. Es ging mir um die Konstante. Ich habe meinen Fehler aber gefunden, #define ist der richtige Weg, bloß der ; am Ende ist falsch 😮


  • Mod

    Erklärung: In C gelten als const gekennzeichnete Variablen nicht als Konstanten für den Compiler, selbst wenn ihr Wert zur Compilezeit fest steht (in C++ wäre das beispielsweise anders). Daher ist, wie du schon selbst heraus gefunden hast, define der richtige Weg. Die ganzen Präprozessormakros sind aber reine Textersetzungen, die vor dem Compiliervorgang stattfinden. Sie haben daher auch rein gar nichts mit der sonstigen Syntax von C zu tun, der Präprozessor ist als ein eigener, unabhängiger Schritt in der Übersetzung anzusehen (oft ist der Präprozessor auch tatsächlich ein eigenständiges Programm, das nicht mit dem Compiler identisch ist).
    Das heißt aus

    #define FOO 2;
    int bar[FOO];
    

    würde

    int bar[2;];
    

    , was offensichtlich falsch ist. Ganz stumpfe Textersetzung eben.

    Eine Alternative zu defines, um echte Compilezeitkonstanten zu erhalten, sind enums. Die sind auch ein echter Teil der Sprache C und halten sich daher an deren Regeln:

    enum {FOO=2};
    int bar[FOO];
    

Anmelden zum Antworten