|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 69
|
Verfasst am: 10.12.2023, 23:21 Titel: Index-Überschreitung |
|
|
Hallo Leute,
ich kämpfe seit langem mit folgendem Problem:
In einer For - Next - Schleife nutze ich den Zähler i etwa derart.
i=0
For i=1 to 9
.
.
.
next i
Dann müßte bei i=9 Schluss sein.
Daran orientiert sich ja mein ganzes nachfolgendes Programm.
Manchmal wird mir für i aber auch eine 10 angeboten, die eigenlich gar nicht auftreten dürfte, also unmüglich sein müßte.
Ich vermeide diesen Fehler( diese 10) indem ich als Korrekturzeile eingebe: if i>9 then i=9
Dennoch taucht er ab und zu trotzdem immer mal wieder auf.
Kann es sein, daß das Programm zu schnell abläuft und i nicht sauber für den nächsten Schritt übermittelt wird?
Ich habe deshalb schon versucht ein "Sleep 1" einzubauen, um dem Rechner etwas Zeit zum Aktualisieren der Variabelen zu geben.
Hat aber nicht wirklich etwas gebracht, sondern nur den Programmablauf unnötig (eben um besagte 1 Sekunde) verlängert.
Hat irgend jemand eine Idee, warum i als Zähler bzw. Index manchmal
"über das Ziel hinausschießt", also größer wird, als es eigentlich sein dürfte?
Mit netten Grüßen Revilo |
|
Nach oben |
|
|
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 339
|
Verfasst am: 11.12.2023, 01:21 Titel: |
|
|
Also wenn du ausschließen kannst, dass du i innerhalb deiner Schleife nicht veränderst, dann wirds eng mit den Vermutungen.
Kannst du ein komplettes Beispielprogramm posten, in dem dieser Effekt auftritt? Ich weiß nicht, ob es QBasic war, aber wenn man auf ungültigen Speicher zugreift zb (irgendwelche Arrayeffekte oder so?), kann es zu komischen Nebenwirkungen kommen. _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 11.12.2023, 19:27 Titel: |
|
|
Sprichst du von einer Variablenabfrage innerhalb oder außerhalb der Schleife?
Bei einer FOR-Schleife wird im NEXT immer erst die Laufvariable erhöht. Dann wird verglichen, ob sich die Variable noch im angegebenen Bereich befindet, und entsprechend wiederholt oder die Schleife verlassen. Das bedeutet: Wenn eine Schleife "FOR i=1 TO 9" komplett durchläuft, hat i danach den Wert 10 - das ist das ganz reguläre Verhalten.
Als Nebeneffekt lässt sich dieses Verhalten nutzen, um zu prüfen, ob die Schleife komplett durchlaufen oder zuvor abgebrochen wurde.
Innerhalb der Schleife kann, wenn man zu sorglos umgeht, ebenfalls einiges schiefgehen, nämlich dann, wenn man den Wert der Laufvariablen anderweitig ändert. Ein typischer Fehler ist etwa in dieser Art:
Code: | FOR i = 1 to 3
FOR i = 1 to 5
' ...
NEXT
PRINT i
NEXT |
oder auch, wenn man innerhalb der Schleife in eine Subroutine aufruft, die den Wert der Laufvariablen ändert, oder ähnliches.
Das sind auf die Schnelle zwei mögliche Fehlerquellen, die mir einfallen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 339
|
Verfasst am: 12.12.2023, 01:21 Titel: |
|
|
Das habe ich total verdrängt, aber habe es gerade in der Dosbox nachgestellt.
Code: | FOR i% = 1 TO 5
PRINT i%
NEXT
PRINT "Nach der Schleife: "; i%
|
Der Code liefert dir die Zahlen von 1-5, und hängt noch eine 6 dran im Anschluss. Wenn man das weiß, kann man natürlich das Programm anpassen. Warum es aber mal so und mal nicht so sein soll, kann ich mir immer noch nicht so recht erklären.[/code] _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|