Initialisieren von Konstanten



  • Hallo,
    ich bin gerade dabei mit C rumzuexperimentieren, nun habe ich eine Frage:

    int create_file(const char* filename, ...)
    {
    // hier die Konstante
      const unsigned long SIZE;
      va_list ptr;
      va_start(ptr, filename);
      unsigned long* pSize = va_arg(ptr, unsigned long*)
    
     if(pSize == NULL) SIZE =  10000000L;
      else SIZE = *pSize;
    //...
    

    Das geht leider nicht in C, da die Konstante gleich initialisiert werden muss, so wie ich es verstehe.

    Welche Moeglichkeiten habe ich hier dennoch zu meinem Ziel zu kommen, SIZE entweder mit einem Wert oder einem Standardwert zu initialisieren (ich brauche SIZE unbedingt als Konstante).
    Danke im voraus 😉



  • eine konstante kann man im nachhinein nicht ändern, also entweder du nimmst eine konstante, z.b. #define SIZE irgendwas oder enum SIZE {irgendwas}, oder, wenn du's doch verändern willst, eine variable.
    🙂



  • In diesem Fall wäre es noch möglich, die Konstante erst anzulegen, wenn du den benötigten Wert kennst:

    int create_file(const char* filename, ...)
    {
      va_list ptr;
      va_start(ptr, filename);
      unsigned long* pSize = va_arg(ptr, unsigned long*)
    
      // hier die Konstante
      const unsigned long SIZE = (pSize==NULL) ? 10000000L : *pSize;
      //...
    

    (klappt allerdings nicht in C89 - das verlangt, daß Variablen am Blockanfang definiert werden)



  • CStoll schrieb:

    (klappt allerdings nicht in C89 - das verlangt, daß Variablen am Blockanfang definiert werden)

    in C89 kann man die neue variable in 'curly braces' packen, aber dann leider nur innerhalb derselben darauf zugreifen.
    🙂



  • Leider arbeiten wir in C89, wie wuerde denn die Loesung mit den "curly braces" aussehen - waere das nicht sowas wie ich oben hergenommen habe? Naja, ich wuerde gerne eine Variable verwenden, allerdings brauche ich sei als Arraygroesse, fuer ein statisches array - was wiederum einen konstanten Wert voraussetzt. Irgendwie beisst sich das dauernd in den Schwanz. Gibt es da keine Loesung in C89?



  • Afaik ist schon deine ursprüngliche Variante nicht C89-konform (die Definition von pSize wäre dafür an der falschen Stelle). Und in C89 kann eine Arraygröße nur als Compilezeit-Konstante definiert werden (und dazu zählt noch nicht einmal eine global definierte "const int" Variable) - wenn du die Arraygröße zur Laufzeit definieren willst, mußt du über malloc() und Co gehen (und denen ist es egal, ob die Größe variabel ist).



  • Naja, ich muss auf Teufel-komm-raus nach C89. Ich stolpere momentan permanent ueber Dinge die es da nicht gibt (hab den Code oben nicht kompiliert, sollte nur ein Bsp sein).

    Die Verwendung von dynamischen Arrays erscheint mir dabei haeufig die einzigste Moeglichkeit zu sein. Den Nachteil den ich da irgendwie sehe, ist hauptsaechlich, dass ich die Groesse dabei immer separat zusaetzlich uebergeben muesste, um einigermassen sichergehen zu koennen, dass das Ding auch nicht ueberlaeuft oder bis zum Ende beschrieben werden kann.

    Danke fuer die Infos!!! 🙂


Anmelden zum Antworten