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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.