Seltsame Fehler mit #define in ANSI-C



  • Hallo,

    ich habe ein sehr seltsames Problem, wo ich nicht einmal im Ansatz weiß, in welche Richtung das gehen könnte.

    Ich hoffe, daß mir hier geholfen werden kann.

    Bei der Programmierung werden die Indices der nachfolgenden Variablen mit #define Anweisungen festgelegt.

    Programmauszug:

    #define DINA4QUER 120
        #define KON_BREITE 120
        #define KON_HOEHE 36
        #define OBEN 5
        #define MITTE 80
        #define MBOXZ 5
        #define UNTEN 36-5
        #define MENUS 120+1
        #define MENUZ  5
        #define DIALS  80
        #define DIALZ  36-5
        #define MTLGS  120-80+1
        [b]#define MTLGZ  36-5-5[/b]
        #define MBOXS  120-80+1
        #define OLWS 80
        #define OLWZ 20
        #define OLWBUFLEN 200
        [b]#define MTLGBUFLEN 200[/b]
        #define MENUX 0
        #define MENUY 0
        #define DIALX 0
        #define DIALY 5
        #define MTLGX 80
        #define MTLGY 5
        #define MBOXX 80
        #define MBOXY 36-5
        #define OLWX (120-80)/2
        #define OLWY (36-20)/2
    

    Das ist jetzt schon der Versuch der Rettung, ursprünglich hieß es anders, nämlich z. B. anstatt 36-5 hatte ich die Bezeichner eingesetzt.

    Das Problem ist vorher schon mal aufgetreten, und jetzt betrifft es die breit markierten Definitionen.

    Tatsache, daß der Compiler zur Laufzeit nicht subtrahieren kann, denn die Fensterdarstellung stimmt nicht.

    Ruft man zum Debugging die Werte auf mit printf(), ergibt sich folgendes:

    printf("MTLGBUFLEN %4i MTLGZ %i4 Differenz %4i ",MTLGBUFLEN,MTLGZ,MTLGBUFLEN-MTLGZ);

    Ausgabe: 200 26 154

    200 ist richtig, 26 ist richtig, nur er kann 26 nicht von 200 subttrahieren???

    Ich kann mir überhaupt nicht erklären, woher das kommen soll.

    Habe aber vorher schon mit dem #define Block Probleme gehabt, daß Zahlenwerte, die aus Addition/Subtraktion resultierten, schlicht falsch waren.

    Kann mir aber überhaupt nicht erklären, woher das kommen soll und wäre für jeden Hinweis sehr dankbar.

    LG Alex



  • Der Präprozessor macht nur Textersetzung. Wenn du

    MTLGBUFLEN-MTLGZ
    

    schreibst, kommt beim Compiler

    200-36-5-5
    

    an.

    Einfacher Workaround:

    #define MTLGZ (36-5-5)
    

    Oder gleich enum.


  • Mod

    😕

    Passt doch. Präprozessor ist reine Textersetzung. MTLGZ ist nicht 26, sondern 36-5-5. Also steht da 200-36-5-5. Und das ist korrekt 154.



  • Manchmal hat man wirklich ein Brett vor dem Kopf, aber darauf wäre ich so gar nicht gekommen.

    **Ich hatte da Speicherüberlauf oder andere Schweinereien vermutet, die mit dem logischen Problem gar nichts zu tun hätten, dachte ich.
    **
    Ich hab das jetzt umgeschrieben mit KLAMMERN (!!!)

    #define DINA4QUER 120
        #define KON_BREITE 120
        #define KON_HOEHE 36
        #define OBEN 5
        #define MITTE 80
        #define MBOXZ 5
        #define UNTEN (KON_HOEHE-MBOXZ)
    
        #define MENUS (120+1)
        #define MENUZ  5
        #define DIALS  80
        #define DIALZ  (KON_HOEHE-OBEN)
        #define MTLGS  (KON_BREITE-MITTE+1)
        #define MTLGZ  (KON_HOEHE-OBEN-MBOXZ)
        #define MBOXS  (KON_BREITE-MITTE+1)
        #define OLWS 80
        #define OLWZ 20
        #define OLWBUFLEN 200
        #define MTLGBUFLEN 200
        #define MENUX 0
        #define MENUY 0
        #define DIALX 0
        #define DIALY 5
        #define MTLGX 80
        #define MTLGY 5
        #define MBOXX 80
        #define MBOXY (KON_HOEHE-MBOXZ)
        #define OLWX ((KON_BREITE-MITTE)/2)
        #define OLWY ((KON_HOEHE-OLWZ)/2)
    

    Und es läuft 1 A!!!! 👍 😋 🤡 🕶 😮

    Gut, daß es so schlaue Leute gibt, die auch noch so blitzschnell helfen können! 👍


Anmelden zum Antworten