Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Index-Überschreitung

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 69

BeitragVerfasst am: 10.12.2023, 23:21    Titel: Index-Überschreitung Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 338

BeitragVerfasst am: 11.12.2023, 01:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 11.12.2023, 19:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 338

BeitragVerfasst am: 12.12.2023, 01:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz