Hallo allerseits,
ich programmiere mit dem Atmel Studio 6.1 auf einem ATtiny84.
Man muss 4 Parameter eingeben.
Diese Routine funktioniert, siehe Photo-Beweis
Den Code hast du schon richtig zusammengefasst (ich gehe davon aus, dass
"up" und "down" unterschiedlich definiert sind sonst gibt es tatsächlich
unterschiede). Ich glaube kaum, dass es am Compiler liegt. Eher vermute
ich einen Fehler in anderem Code.
Peter Zz schrieb:> Spinnt der Compiler oder habe ich etwas übersehen?
Die Compiler haben selten Bugs ... die sitzen in 99,999% der Fälle vor
dem Bildschirm.
Peter Zz schrieb:> Wo mag der Fehler liegen?Peter Zz schrieb:> if((Taste == up) || (Taste == down))> {> set_pos(Nr,60,absolut);> LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0x0000);> if(Taste == up) Nr--;> if(Taste == down) Nr++;
Du liest "Taste" mehrfach ein. Darin dürfte der Hund begraben liegen.
Das ist ein gerne gemachter Fehler. Taste einmal einlesen z.B. in
Taste_Temp und dann damit weiter arbeiten. Evtl ändert sich (z.B. auch
durch prellen) der Zustand der Taste nachdem du in das
> if((Taste == up) || (Taste == down))
eingetaucht bist und ist dann bei
> if(Taste == up) Nr--;> if(Taste == down) Nr++;
schon wieder anderst.
Peter Zz schrieb:> return(links);
Tut jetzt nix zur Sache, aber die Klammern bei return sind unnötig und
kontraintuitiv.
"return" ist ein Operator, und keine Funktion.
return(i) + 1;
macht dasselbe wie
return i+1;
Peter Zz schrieb:> Spinnt der Compiler oder habe ich etwas übersehen?
ALso ich seh jetzt auch nichts, was den Effekt erklären könnte.
Wenn du noch immer im Dunkeln tappst, dann geh in kleinen Schritten vor.
Erst mal wieder alles zurück auf Anfang
das dürfte jetzt noch nichts geändert haben. Aber 'dürfte' ist nicht
'hat nicht'. Also ist testen angesagt.
Wenn sich tatsächlich nichts verändert hat, dann fängst du an, in
einzelnen Schritten den gemeinsamen Code aus den beiden if rauszuziehen.
Immer nur 1 Anweisung nach der anderen. Und nach jeder Änderung: testen.
Das muss sich ja finden lassen, was da los ist.
Peter Zz schrieb:> Vielleicht hatte ich ... den Compiler durch die schiere Menge an> Übergabewerten ... verwirrt???
Von welcher schieren Menge sprichst du? Ich seh da 5 Parameter, und?
Hättest du da jetzt 500 Parameter, würd ich sagen:
Ja..., gut, wird langsam einbisschen unübersichtlich, aber auch das
juckt den Compiler nicht.
Hast du Compileroptimierung eingeschaltet? Wenn ja, welcher Level?
Hast du vielleicht einmal im Debug und einmal im Release compiliert?
Benutzt du den C oder den C++ Compiler? Hast du immer den selben
Compiller benutzt? Zwischen durch irgendwelche Compilerflags geändert?
Ganz nebenbei:
Peter Zz schrieb:> 132 schrieb:>> Du liest "Taste" mehrfach ein. Darin dürfte der Hund begraben liegen.>> Nö: Taste = get_key();> if(Taste_alt == keine_Taste) // Entprellung> {>> //hier steht der Code>> }> Taste_alt = Taste;> Nur einmal lesen!
Nur einmal mitdenken!
Das kann hier keiner riechen, wenn du sowas nicht postest!
Peter Zz schrieb:> Diese Routine funktioniert, siehe Photo-Beweis
Fällt mir schwer von dem bisschen Code auf das Photo oder umgekehrt zu
schließen.
Peter Zz schrieb:> Vielleicht hatte ich vorher den Compiler durch die schiere Menge an> Übergabewerten an die Funktion
Sehr viel wahrscheinlicher ist es, dass du noch irgendwo anders in
deinem Programm mindestens einen Fehler hast.
Sorry. Aber das ist so. Die "Hoffnung", das der Compiler fehlerhaft ist,
ist in mehr als 99% aller Fälle unbegründet. Es ist wesentlich (ganz
groß geschrieben) wahrscheinlicher, das du einen Programmfehler hast.
Der muss noch nicht mal in dieser Funktion sitzen. Der muss noch nicht
mal irgendwas mit dem beobachteten Symptom zu tun haben.
D.h. um es klipp und klar zu sagen: Du hast sehr wahrscheinlich noch
mindestens einen Fehler im Programm, der jetzt nur darauf wartet, im
ungünstigsten Moment zuzuschlagen. Durch die Programmänderung hast du
die Auswirkungen des Fehlers in irgendeinen anderen Codebereich
verschoben.