Lauflicht: Array[0] wird nach dem ersten Durchlauf nicht Angesprochen
-
Der Versuch eine Art von Lauflicht (0 für aus 1 für an) auf Basis eines Arrays scheitert an der Tatsache das sich der Array[0] nach dem 1.Durchlauf der FOR Scheife nicht mehr aufrufen lässt.
#include <stdio.h> //Ausagabe des Arrays im Format "Array[0] Array[0] ... \n" void ausgabe(int feld[],int anz){ int i; system("cls"); for (i=0; i<anz; i++) printf("%i ", feld[i]); if (i=anz-1); printf("\n"); system("pause"); } int main(void){ int stellen[10]={0}, i; for (i=0; i<10; i++){ stellen[i]=1; ausgabe(stellen, 10); stellen[i]=0; if (i==9){ i=0; //Rücksetzen der Zählvariable } } return 0; }
Letztendlich ist es eine Endlosschleife welche durch Tastendruck einen Schritt weiterläuft.
Ich bin ziemlich sicher das der Fehler irgendwo hier liegt:
if (i==9){ i=0; //Rücksetzen der Zählvariable }
Die FOR Schleife wird wieder begonnen, bloss mit i=1.
Wo ist mein Denkfehler?
-
Nach dem Ende des Schleifenkörpert wird i um eins erhöht:
for (i=0; i<10; i++){ // <-- deswegen
Die einfachste Methode wäre wohl,
for(i = 0; /* Abbruchbedingung wird eh nie wahr */; i = (i + 1) % 10) {
zu schreiben und sich die if(i == 9) ...-Geschichte zu sparen.
-
seldon schrieb:
Nach dem Ende des Schleifenkörpert wird i um eins erhöht:
for (i=0; i<10; i++){ // <-- deswegen
Die einfachste Methode wäre wohl,
for(i = 0; /* Abbruchbedingung wird eh nie wahr */; i = (i + 1) % 10) {
zu schreiben und sich die if(i == 9) ...-Geschichte zu sparen.
Stimmt, an die einfachsten Sachen denk man immer am Ende.
Die Lösung ist Elegant gewählt. Ich werde mich aber eher dazu entscheiden erstmal die Zählvariable am ende auf -1 zu setzten da ich vielleicht später doch eine Endbedingung brauchen könnte.
Vielen Dank für die schnelle Lösung.
-
Und was soll's bringen? Die Endbedingung kannst du hinterher immer noch in die for-Schleife einbauen.
PS: Dir ist schon klar, daß die if-Anweisung in Zeile 12 sinnlos ist? Erstens ist das eine Zuweisung, die immer wahr ist, zweitens ist i nach Durchlauf der vorigen Schleife immer gleich anz (d.h. wenn du erstens gelöst hast, ist die Bedingung immer falsch) und drittens steuert das if() nur die leere Anweisung.
PPS: Und statt system("pause") solltest du lieber mit C++ Mitteln arbeiten.
-
Und irgendwie gehört für mich die 'Pause'-Instruktion in die for-Schleife und nicht in die ausgabe - Funktion.
-
CStoll schrieb:
PPS: Und statt system("pause") solltest du lieber mit C++ Mitteln arbeiten.
iiiiihhhh C++
Falscher Film.
Jetzt krieg ich die Codezeilen nicht mehr aus dem KopfMan kann statt dem Aufruf von cls auch mit \r arbeiten.
-
CStoll schrieb:
Und was soll's bringen? Die Endbedingung kannst du hinterher immer noch in die for-Schleife einbauen.
PS: Dir ist schon klar, daß die if-Anweisung in Zeile 12 sinnlos ist? Erstens ist das eine Zuweisung, die immer wahr ist, zweitens ist i nach Durchlauf der vorigen Schleife immer gleich anz (d.h. wenn du erstens gelöst hast, ist die Bedingung immer falsch) und drittens steuert das if() nur die leere Anweisung.
PPS: Und statt system("pause") solltest du lieber mit C++ Mitteln arbeiten.
Ja, mir ist es aufgefallen nachdem ich es gepostet habe. Habe es auch gleich entfernt.
Ich wollte einfach nur eine Pause zwischen jeden Schritt haben, der einfachste Befehl der mir eingefallen ist war eben system break. (Ist auch bei einem so banalen Programm eig. recht uninteressant).
@DirkB
Cls habe ich einfach genommen da ich es noch aus alten DOS Zeiten kenne.
Trotzdem Danke für die Idee!@Belli
Liegt wohl am Persönlichen ermessen, ich könnte die Ausgabefunktion auch in anderen Routinen einbauen und hätte somit auch in diesen eine vollständige Einsicht des Arrays (ohne an der Main zu hantieren).
-
Spidi10 schrieb:
@Belli
Liegt wohl am Persönlichen ermessen, ich könnte die Ausgabefunktion auch in anderen Routinen einbauen und hätte somit auch in diesen eine vollständige Einsicht des Arrays (ohne an der Main zu hantieren).Gerade wenn du sie auch woanders verwenden willst, sollte sie sich auf ihre Hauptaufgabe beschränken - das Ausgeben des Arrays. Wenn du nach der Ausgabe eine Pause benötigst, kannst du zusätzlich noch einen entsprechenden Aufruf hinzufügen.