define und array



  • Hy leute
    Ich habe mal ein C-Problem:

    typedef unsigned char bool;
    #define SCREEN_WIDTH = 500;
    #define SCREEN_HEIGHT = 500;
    
    bool field[SCREEN_WIDTH][SCREEN_HEIGHT];
    
    typedef unsigned char bool;
    bool field[500][500];
    

    Der untere Code wird ohne probleme kompiliert.
    Beim oberen erhalte ich aber folgende Fehlermeldungen:

    error: expected expression before ‘=’ token
    error: expected identifier or ‘(’ before ‘]’ token
    

    Wieso geht das nicht und wie loese ich das?



  • // entweder
    #define SCREEN_WIDTH  500
    #define SCREEN_HEIGHT 500
    
    // besser
    const int ScreenWidth = 500;
    const int ScreenHeight= 500;
    


  • *facepalm* alles klar^^

    wieso ist const int besser als define?



  • Achso, die Erklärung ist, dass vor dem Compiler der Makroprozessor eine Textersetzung durchführt.
    Alle Textvorkommen von SCREEN_WIDTH werden durch "500", bei deinem Code jedoch durch "= 500;" ersetzt.
    Also

    bool field[= 500;][= 500;];
    

    Wenn man nicht gute Gründe hat (Include-Guards etc), sollte man daher, zumindest am Anfang, weitestgehend auf Präprozessor-Direktiven verzichten.



  • ach so ich verstehe 🙂

    danke fuer die schnelle und gute hilfe 😃



  • Den zweiten Post hatte ich zu schnell abgesetzt.
    Warum const int statt define? Der Makroprozessor führt wie geschrieben eine reine Textersetzung durch, zu mehr ist er nicht in der Lage.
    Wenn du statt des defines direkt const int verwendet hättest, bspw. so

    const int ScreenWidth = 500 // Semikolon fehlt
    

    hätte der Compiler einen Fehler direkt bei der Definition von ScreenWidth gemeldet. Bei dem define meldet er den Fehler, wie du gemerkt hast, nicht bei dessen Definition, sondern erst bei dessen Verwendung.
    Generell sind Makros auch nicht nur böse, sie sind in einigen Fällen sehr nützlich und im Falle von Include-Guards fast unabdingbar, doch am Anfang hat man wahrscheinlich genug andere Probleme, als sich auch noch mit ihnen herumschlagen zu müssen.



  • Auf const - Konstanten als Angabe für Array-Dimensionen antwortet
    zumindest mein C-Compiler (nicht ganz zu Unrecht) mit einem Übersetzungsfehler.
    const-Konstanten sind nicht automatisch Immediate-Werte, aber nur letztere
    dürfen zwischen den Klammern stehen.
    #define-Konstanten sind hingegen in jedem Fall erlaubt.



  • Das ist so nicht ganz korrekt. Die 1999 eingeführte Revision des C-Standards (C99) erlaubt die Angabe von Array-Breiten sogar durch Variablen und nennt diese dann variable length arrays bzw. VLAs. Sie macht dann allerdings keinen Unterschied zwischen int const und int, obwohl ein optimierender Compiler dazu natürlich in der Lage sein kann.

    Jetzt ist es leider so, dass C99 noch nicht von allen gängigen C-Compilern unterstützt wird - insbesondere MSVC tanzt hier aus der Reihe - aber auch der beherrscht VLAs, von daher kann man sie in der Praxis überall problemlos einsetzen. In der Tat beherrschten die meisten C-Compiler dieses Feature schon vor 1999, was einer der Gründe für dessen Aufnahme in den Standard gewesen sein dürfte.

    Wenn dein C-Compiler darauf mit einem Übersetzungsfehler reagiert, ist er entweder erstaunlich alt, oder du hast ihm C99 explizit verboten. Mal wild geraten: Wenn du gcc mit -ansi benutzt, ersetz -ansi durch -std=c99.


Anmelden zum Antworten