![]() |
for i:=0 to 3 do => wieso wird i = 4?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Community,
Ich bin gerade völlig ratlos. Innerhalb einer for-Schleife ist es mir/Delphi gelungen, i über den maximalen Index hinaus zu definieren. Aber seht erst mal selbst auf meinen Screenshot und teilt mir dann bitte eure Erklärung(en) mit. mfg Nogge |
Re: for i:=0 to 3 do => wieso wird i = 4?
Wenn du aus Versehen irgendwo Speicherbereiche überschreibst, kann dir alles gelingen :zwinker: . Eine andere Möglichkeit fällt mir gerade auch nicht ein (es sei denn, du manipulierst i absichtlich :wink: ).
|
Re: for i:=0 to 3 do => wieso wird i = 4?
RangeChecks aktiviert?
Einer deiner Container kann, dir in dein "i" hineinschreiben. ;) |
Re: for i:=0 to 3 do => wieso wird i = 4?
Schalt mal die Optimierungen aus, sonst kann der Debugger keine praezisen Daten anzeigen.
|
Re: for i:=0 to 3 do => wieso wird i = 4?
Die Schleife befindet sich innerhalb einer Funktion, die sich selbst immer mal aufruft, d.h. die Funktion ist rekursiv gestaltet. Allerdings werden die Variablen der Funktion doch jedesmal wieder nach einem erneuten, rekursiven Aufruf seperat auf den Stack gelegt, um so von derselben Funktion nicht wieder überschrieben wird, oder?
ASM-Code habe ich überhaupt nicht verwendet, d.h. ich kann auf keinen Fall direkt irgendwelche Speicherbereiche überschrieben haben. |
Re: for i:=0 to 3 do => wieso wird i = 4?
ist das wirklich ein i wo da angezeigt wird, oder ist das ein j(Die sehen sich in der IDE sehr ähnlich)? welchen Wert hat j zu dem Zeitpunkt?
Hehe.. hab das selbe mal ausprobiert
Delphi-Quellcode:
macht mal Haltepunkt auf Beep und schaut was i für en Wert hat.. :stupid: bei mir es es auch 4
for i:= 0 to 3 do
for j:= 0 to 4 do Beep; Hier allerdings=>
Delphi-Quellcode:
Hat i den korrekten Wert.
for i:= 0 to 3 do
for j:= 0 to 4 do feld[i,j]:=Wert; meine Vermutung ist, das i in der oberen Version die "Range" beinhaltet(0,1,2,3 = 4 Werte) in der unteren Version wird die Variable gebraucht, daher sollte man auch wissen was für einen Wert i hat, da es in diesem fall relevant ist. |
Re: for i:=0 to 3 do => wieso wird i = 4?
Wie du vllt in dem Screenshot gesehen hast, werden j und i (es ist eigentlich deutlich zu erkennen, dass es zwei verschiedene Variablen sind^^) in der if-Abfrage benötigt, d.h. da taucht kein Beep oder ähnliches auf.
Ein Vorteil ist jetzt ja schon mal, dass du den Fehler ebenfalls herbeiführen konntest, so dass er reproduktiv ist und somit nichts mit rekursiven Funktionen usw. zu tun hat. Vllt hilft das ja jemandem zur Problemlösung. btw das unglaubliche dabei ist ja, dass das statische array mit einem zu hohen Index angesprochen wird, Delphi jedoch keine Fehlermeldung zurückgibt, sondern mit einem zufälligen Wert weitermacht! |
Re: for i:=0 to 3 do => wieso wird i = 4?
Zitat:
Delphi-Quellcode:
ein Vergleich, ob I noch grösser als 0 ist, ist weniger "anstrengend" (lediglich Zero-Flag auslesen) also der Vergleich, ob I noch kleiner als 3 ist (Subtraktion notwendig)...
I:=4;
Repeat for j:= 0 to 4 do Beep; Dec(I); Until (I = 0); |
Re: for i:=0 to 3 do => wieso wird i = 4?
Zitat:
|
Re: for i:=0 to 3 do => wieso wird i = 4?
Normalerweise gibt's ne AV, wenn der Index bei nem array überschritten wird. Daher ist es unglaublich für mich. Auch bei aktiviertem Range-Checking erhalte ich keine Meldungen.
Allerdings scheint es jetzt zu funktionieren, obwohl ich nichts im Code verändert habe. Jediglich Range-Checking und Overflow-Checking ist von jetzt an aktiviert. Vielen Dank für Eure Hilfe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz