Hallo, Verzweifel gerade irgendwie :) Folgendes Problem #define ZAHL 200 #define TEST_MACRO0(x) PORTB = x #define TEST_MAKRO1(x) TEST_MACRO0(ZAHL - x) int main(void) { TEST_MAKRO1(22+20); return 0; } ergibt folgendes Diassembly +00000D68: E3E8 LDI R30,0x38 Load immediate +00000D69: E0F0 LDI R31,0x00 Load immediate +00000D6A: EC86 LDI R24,0xC6 Load immediate +00000D6B: 8380 STD Z+0,R24 Store indirect with displacement und Ergebniss 0xC6 = 198 statt wie erwartet 158 = 200 - (22+20) Sieht nach einem Vorzeichenproblem aus, aber wie macht man es richtig. Nutze AVR Studio mit Winavr 20070122. An verschiedene Kompilerflags bzw. Optimierungsstufen habe ich schon erfolglos rumgespielt und versteht momentan oder vielleicht noch nicht die eigentlich schöne C Welt Danke Alex
TEST_MAKRO1(22+20); -> TEST_MACRO0(200 - 22+20) -> PORTB = 200 - 22+20 D.h. PORTB = 198 So funktioniert es: #define ZAHL 200 #define TEST_MACRO0(x) PORTB = (x) #define TEST_MAKRO1(x) TEST_MACRO0(ZAHL - (x)) Erste Macro-Regel: Formale Parameter auf der rechten Seite immer klammern!
Besten Dank, funktioniert - hat mich einiges an Zeit gekostet aber dafür ist der Lerneffekt grösser :). Gruss Alex
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.