Mein AVR-Studio gibt mir bei meinem Programm folgende Fehler aus: ------------------------------------------------------------------------ c:16: lvalue required as increment operand c:18: lvalue required as decrement operand ------------------------------------------------------------------------ das Programm lautet: #include <avr/io.h> #include <util/delay.h> #ifndef F_CPU #define F_CPU 16000000UL #endif #define TON #define TASTER1 0b00001000 #define TASTER2 0b00000100 #define SUMMER 0b10000000 void ZEIT (void) { while(1) { TON = TON++; //c:16 _delay_ms(1000); TON = TON--; //c:18 _dalay_ms(1000); } } int main(void) { DDRD = 0b11100000; BEGIN:; if ((PORTD & TASTER1) == TASTER1) { while(1) { PORTD = SUMMER; _delay_ms(TON); PORTD = 0; _delay_ms(TON); if ((PORTD & TASTER2) == TASTER2) { goto BEGIN; } } } return 0; } ---------------------------------------------- wo ist da jetzt der Fehler? Kann mir jemand helfen?
Jannik schrieb: > #define TON Schau mal bitte im C-Grundkurs nach, was Du da versuchst. Dann wird Dir der Fehler auch klar.
Hallo Jannik,
das geht entweder so:
while(1) {
TON = TON + 1; //c:16
_delay_ms(1000);
TON = TON - 1; //c:18
_dalay_ms(1000);
}
}
oder so:
while(1) {
TON++; //c:16
_delay_ms(1000);
TON--; //c:18
_dalay_ms(1000);
}
}
oder so:
while(1) {
TON += 1; //c:16
_delay_ms(1000);
TON -= 1; //c:18
_dalay_ms(1000);
}
}
Grüße,
Peter
Horst schrieb: > Jannik schrieb: >> #define TON > > Schau mal bitte im C-Grundkurs nach, was Du da versuchst. Dann wird Dir > der Fehler auch klar. Ja, genau, stimmt auch, hab ich ganz überlesen, TON muss natürlich eine Variable sein, Konstanten kann man nicht im Wert ändern.
oh stimmt, da war ich wohl zu doof für, dass ich das nicht gesehen habe :D
Erstmal ganz egal, Hauptsache es ist keine Konstante, die kann man nämlich nicht ändern. Und eins draufaddieren oder subtrahieren ändert doch den Wert - oder? Dann muss man sich noch überlegen, wie groß die Zahlen werden, die dort auftreten und ob sie negativ werden. Danach wählt man den Datentyp (short, int, long, signed, unsigned...) der Variable. Überhaupt verstehe ich nicht, was das werden soll. In ZEIT wird irgendwas komisches gemacht, im Wesentlichen ja 2 Sekunden gewartet und sonst nichts, aber die ganze Funktion wird nie verwendet. Und dann in main die Konstruktion mit dem goto... Goto sollte man komplett vermeiden, es gibt nur ein paar ganz wenige Ausnahmefälle in denen das sinnvoll ist. Das Abbrechen von einer while(1)-Schleife geht mit break. Dann: Was passiert da genau mit PORTD? Die Taster sind offenbar dort angeschlossen, aber SUMMER schreibt auf den ganzen Port. Da stimmt doch was nicht...
Jannik schrieb: > #define TON Peter Diener schrieb: > TON muss natürlich eine > Variable sein, Konstanten kann man nicht im Wert ändern. Das Problem ist hier vor allem, dass TON definiert wird zu "Nichts". Also weder Konstante noch Variable. #define kann nur den zuerst angegebenen Text durch den dahinter angegebenen ersetzen, wenn da nichts steht wird jede Erwähnung von "TON" komplett eliminiert. Aus der Zeile:
1 | TON = TON++; |
macht der Compiler also ein "solides"
1 | = ++; |
und fragt sich zurecht, worauf er diese Operatoren denn nun anwenden soll. Dass das mit dem x=x++; ein doppelt gemoppeltes, wenig sinnvolles Konstrukt ist, sind die Vorschreiber ja schon genügend eingegangen.
Der Mensch braucht ein C Buch. Und zwar dringend. Und Leute, TON ist keine Konstante. Das ist einfach auch falsch.
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.