Ich versteh nicht warum, aber sobald er die innerste while Schleife
durchlaufen hat, verlässt er automatisch alle anderen Schleifen auch.
Als wäre irgendwo ein riesen break; versteckt. Die vorherige wird aber
noch bis zum Ende durchlaufen. Also in der for () wird PORTC noch auf 0
geschalten, und die 1. while Schleife noch 1x X erhöht. Aber er
durchläuft while kein weiteres mal. Ich versteh nicht, warum nicht
wieder normal die vorherigen Schleifen weiterlaufen, sondern beendet
werden. gcc meldet keine Fehler und übertragen kann ich es normal.
Der Code dient jetzt nur zum Testen einiger 7-Segmentanzeigen. Im code[]
Array sind die verschiedenen Segmentcodes gespeichert.
Es soll:
- eine Zahl anzeigen (while1)
- die innereste while 20x durchlaufen lassen
- in der 1. while die nächste Zahl anzeigen
- wieder innerste while, usw.
- das ganze 2x; dafür die for()
i, x und y sind deklariert als int.
Alle 3 Zählvariablen sind am Anfang als 0 deklariert.
int i = 0;
int x = 0;
int y = 0;
Und solange sie kleiner als die Schleifenprüfung sind, müsste es ja
immer laufen.
Das Problem ist dass, wie Skua gesagt hat, die Variablen der inneren
Schleifen einmal hochlaufen und dann auf ihrem Wert der Größe als die
Bedingung der While Schleife ist Hängenbleiben. Die for Schleife läuft
zwar Ordnungsgemäß durch aber nach dem ersten Durchlauf werden ja die
beiden while Schleifen nicht mehr ausgeführt. du musst es also so
machen:
for()
{
while(x)
{
while(y)
{
}
y=0;
}
x=0;
}
Zusätzlich ist nicht definiert was die Funktion strlen(code)
zurückliefert.
strlen sucht nach einem 0x00 als Endekennung eines Strings.
Dies ist im char[] nicht definiert und was nach dem Array kommt kann
niemand sagen.
In diesem Fall wäre es besser mit sizeof() zu arbeiten, da dies der
Compiler schon zur Compilierung auflösen kann und nicht zur Laufzeit
bei jedem Schleifendurchlauf berechnet werden muss.
Ich mache sowas gerne in folgender Form:
while (x < (sizeof(code) / sizeof(char))) {
Das kann der Compiler komplett auflösen und wenn sich z.B.
Datentypen ändern (nicht in diesem Fall, aber wenn statt char Strukturen
vorhanden sind) muss keine Anpassung gemacht werden.
JensM wrote:
> Zusätzlich ist nicht definiert was die Funktion strlen(code)> zurückliefert.>> strlen sucht nach einem 0x00 als Endekennung eines Strings.> Dies ist im char[] nicht definiert und was nach dem Array kommt kann> niemand sagen.>
ist doch definiert:
> In diesem Fall wäre es besser mit sizeof() zu arbeiten, da dies der> Compiler schon zur Compilierung auflösen kann und nicht zur Laufzeit> bei jedem Schleifendurchlauf berechnet werden muss.>> Ich mache sowas gerne in folgender Form:>> while (x < (sizeof(code) / sizeof(char))) {>> Das kann der Compiler komplett auflösen und wenn sich z.B.> Datentypen ändern (nicht in diesem Fall, aber wenn statt char Strukturen> vorhanden sind) muss keine Anpassung gemacht werden.
aber ansonsten hast Du vollkommen recht, zumal bei der 0x00 mitten im
String dieser nicht vollständig abgearbeitet wird...