Forum: Mikrocontroller und Digitale Elektronik While Schleife klappt nicht


von Peter (Gast)


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

von Falk S. (falkschilling)


Lesenswert?

Peter schrieb:
1
while((ready = 0))

Gewöhn dir Meister-Yoda-Style an:
1
while( NULL != ready )

von (prx) A. K. (prx)


Lesenswert?

Kennst du den Unterschied zwischen = und == ?

von Falk S. (falkschilling)


Lesenswert?

Sorry, meinte 0, nicht NULL.

von Peter (Gast)


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--

von und gut isses (Gast)


Lesenswert?

Peter schrieb:
> while((ready = 0))

while (ready == 0)

von Tom K. (ez81)


Lesenswert?

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'

von Yalu X. (yalu) (Moderator)


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.

: Bearbeitet durch Moderator
von Johann L. (gjlayde) Benutzerseite


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 :-)

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.