Forum: Compiler & IDEs Spinnt der Compiler?


von Peter Z. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo allerseits,
ich programmiere mit dem Atmel Studio 6.1 auf einem ATtiny84.
Man muss 4 Parameter eingeben.
Diese Routine funktioniert, siehe Photo-Beweis
1
if(Taste == down)
2
{
3
  set_pos(Nr,60,absolut);
4
  LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0x0000);
5
  Nr++;
6
  Nr &= 0x03;
7
  set_pos(Nr,60,absolut);
8
  LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0xFFFF);
9
}
10
if(Taste == up)
11
{
12
  set_pos(Nr,60,absolut);
13
  LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0x0000);
14
  Nr--;
15
  Nr &= 0x03;
16
  set_pos(Nr,60,absolut);
17
  LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0xFFFF);
18
}
Diese Routine habe ich daraus vereinfacht,
sollte eigentlich das gleiche machen,
tut sie aber nicht, die Markierung der Zahlen bleibt!
1
if((Taste == up) || (Taste == down))
2
{
3
  set_pos(Nr,60,absolut);
4
  LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0x0000);
5
  if(Taste == up)   Nr--;
6
  if(Taste == down) Nr++;
7
  Nr &= 0x03;
8
  set_pos(Nr,60,absolut);
9
  LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0xFFFF);
10
}
Wo mag der Fehler liegen?
Spinnt der Compiler oder habe ich etwas übersehen?

von sebi707 (Gast)


Lesenswert?

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.

von 132 (Gast)


Lesenswert?

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.

von Peter Z. (Gast)


Angehängte Dateien:

Lesenswert?

132 schrieb:
> Du liest "Taste" mehrfach ein. Darin dürfte der Hund begraben liegen.

Nö:
1
  Taste = get_key();
2
  if(Taste_alt == keine_Taste) // Entprellung
3
   {
4
5
6
   //hier steht der Code
7
8
9
   }
10
  Taste_alt = Taste;
Nur einmal lesen!
1
enum{keine_Taste,up,down,rechts,links,Enter};
2
//*********************************************************************
3
4
      //hier steht auch Code der jetzt nicht interressiert
5
6
//*********************************************************************
7
unsigned char get_key(void)
8
{
9
  unsigned short int adc_wert = get_adc(2);
10
  if((adc_wert >= 140) && (adc_wert <= 200)) return(links);
11
  if((adc_wert >= 310) && (adc_wert <= 370)) return(down);
12
  if((adc_wert >= 480) && (adc_wert <= 540)) return(rechts);
13
  if((adc_wert >= 650) && (adc_wert <= 710)) return(up);
14
  if((adc_wert >= 820) && (adc_wert <= 880)) return(Enter);
15
  return(keine_Taste);
16
}
17
//*********************************************************************
Siehe Schaltplan

von Εrnst B. (ernst)


Lesenswert?

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;

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Da hätte ich auch noch was. Ein "else" vor den entsprechenden 
if-Statements können zu einer weiteren Optimierung des ausführbaren 
Codes führen.

von Karl H. (kbuchegg)


Lesenswert?

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
1
if(Taste == down)
2
{
3
  set_pos(Nr,60,absolut);
4
  LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0x0000);
5
  Nr++;
6
  Nr &= 0x03;
7
  set_pos(Nr,60,absolut);
8
  LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0xFFFF);
9
}
10
if(Taste == up)
11
{
12
  set_pos(Nr,60,absolut);
13
  LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0x0000);
14
  Nr--;
15
  Nr &= 0x03;
16
  set_pos(Nr,60,absolut);
17
  LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0xFFFF);
18
}

wenn das noch klappt, dann kleine MOdifikationen.
Erste MOdifikation
ein gemeinsames 'if' rundherum legen
1
if( Taste == down || Taste == up )
2
{
3
  if(Taste == down)
4
  {
5
    set_pos(Nr,60,absolut);
6
    LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0x0000);
7
    Nr++;
8
    Nr &= 0x03;
9
    set_pos(Nr,60,absolut);
10
    LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0xFFFF);
11
  }
12
  if(Taste == up)
13
  {
14
    set_pos(Nr,60,absolut);
15
    LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0x0000);
16
    Nr--;
17
    Nr &= 0x03;
18
    set_pos(Nr,60,absolut);
19
    LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0xFFFF);
20
  }
21
}

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.

von Peter Z. (Gast)


Lesenswert?

Habe jetzt einiges in die Funktion
1
void Parameter_anzeigen(uint8_t Markierung)
gepackt.

Jetzt auf einmal geht folgendes:
1
if((Taste == down) || (Taste == up))
2
{
3
  Parameter_anzeigen(nicht_markiert);
4
  if(Taste == down) Nr = (Nr + 1) & 0x03;
5
  if(Taste == up)   Nr = (Nr - 1) & 0x03;
6
  Parameter_anzeigen(markiert);
7
}
Vielleicht hatte ich vorher den Compiler durch die schiere Menge an
Übergabewerten an die Funktion
1
LCD_Anzeige_Zahl(klein,Zahl[Nr],Stellen[Nr],Komma[Nr],0x0000);
verwirrt???

von Kaj (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
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
Noch kein Account? Hier anmelden.