While Schleife klappt nicht

Gast #3426300
Lesenswert?

Hallo ich hab eine einfache Funktion für ein Selektion geschrieben, 
jedoch funktioniert diese nur wenn
while(1)... verwendet wird, der nachteil ist bei diesem, dass ich nie 
mehr rauskomme deshalb hab ich eine variable und die while schleife soll 
auf das ändern dieser reagieren
1
void select(void)
2
{
3
unsigned int ready;
4
ready = 0;
5
out("Waehle Animation\n");
6
lcd_puts(">Animation ");
7
index = 0;
8
char text[15];
9

10

11
  while((ready = 0))
12
  {  
13
    if ( !(PIND & (1<<PIND2)) ) 
14
    {
15
      out("Waehle Animation\n");
16
      lcd_puts(">Animation ");
17
      utoa(index, text, 10);
18
      lcd_puts(text);
19
      index++;
20
      delay_ms(1500);
21
    }
22
    if ( !(PIND & (1<<PIND3)) ) 
23
    {
24
      ready = 1;
25
      delay_ms(1500);
26
    }
27
  }
28
}
das problem ist aber sie wird einfach übersprungen ohne jegliche 
reaktion
lg
Gast #3426311
Lesenswert?

Der unterschied zwischen = und == ist der schlüssel :@ immer diese 
syntax!
ja mit = weißt man einen wert zu und mit == vergleicht man.
ich schwenke gerade von basic auf c um und das ist ziemlich verwirrend, 
aber vielen dank für euere hilfe!!
klappt jetzt auch
--closed--
Moderator #3426357
Lesenswert?

Warum hast du
1
  while((ready = 0))

mit doppelten Klammern geschrieben?

Aber nicht etwa, weil dir der Compiler das empfohlen hat:
1
warning: suggest parentheses around assignment used as truth value

Wenn doch: Schau dir die Meldung noch einmal genau an: Da ist die Rede
von "assignment", was ein wichtiger Hinweise auf einen mögliche Fehler
ist.

Tipp: Schreibe in Zukunft die If-Bedingungen grundsätzlich in einfache
Klammern (wobei natürlich innerhalb des Ausdrucks weitere Klammern
vorkommen dürfen) und aktiviere die Warnungen des GCC mit -Wall. Lässt
du dann versehentlich das zweite Gleichheitszeichen weg, liefert der
GCC die obige Warnung.

In den ganz seltenen Fällen, wo du das Ergebnis einer Zuweisung auf null
abprüfen möchtest, schreibst du das explizit hin wie in diesem Beispiel:
1
int countchar(char *str, char ch) {
2
  int n = 0;
3

4
  while((str = strchr(str, ch)) != NULL) {
5
    str++;
6
    n++;
7
  }
8
  return n;
9
}

Damit teilst du deine Absicht nicht nur dem Compiler, sondern auch einem
späteren Leser des Quellcodes mit.

Du kannst aber auch Zuweisungen innerhalb von Bedingungen auch gleich
vermeiden, auch wenn dadurch der Code etwas länger wird.
Persönliche Seite #3426359
Lesenswert?

Tom K. schrieb:
> Falk Schilling schrieb:
>> Peter schrieb:while((ready = 0))
>>
>> Gewöhn dir Meister-Yoda-Style an:
>> while( NULL != ready )
>
> Nein, lies stattdessen die Compilerwarnungen (wer ohne -Wall compiliert,
> ist selbst schuld ;) ):
>
1
'warning: suggest parentheses around assignment used as truth value'

Und genau das hat er auch gemacht: Doppelte Klammern gesetzt

--> Warnung erfolgreich beseitigt :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren