Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi for i:=0 to 3 do => wieso wird i = 4? (https://www.delphipraxis.net/62367-i-%3D0-3-do-%3D-wieso-wird-i-%3D-4-a.html)

Nogge 3. Feb 2006 14:20


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

Khabarakh 3. Feb 2006 14:25

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: ).

Elvis 3. Feb 2006 14:26

Re: for i:=0 to 3 do => wieso wird i = 4?
 
RangeChecks aktiviert?
Einer deiner Container kann, dir in dein "i" hineinschreiben. ;)

Robert Marquardt 3. Feb 2006 14:29

Re: for i:=0 to 3 do => wieso wird i = 4?
 
Schalt mal die Optimierungen aus, sonst kann der Debugger keine praezisen Daten anzeigen.

Nogge 3. Feb 2006 14:34

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.

Angel4585 3. Feb 2006 14:57

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:
for i:= 0 to 3 do
 for j:= 0 to 4 do
  Beep;
macht mal Haltepunkt auf Beep und schaut was i für en Wert hat.. :stupid: bei mir es es auch 4

Hier allerdings=>

Delphi-Quellcode:
for i:= 0 to 3 do
 for j:= 0 to 4 do
  feld[i,j]:=Wert;
Hat i den korrekten 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.

Nogge 3. Feb 2006 15:07

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!

Basilikum 3. Feb 2006 15:18

Re: for i:=0 to 3 do => wieso wird i = 4?
 
Zitat:

Zitat von Angel4585
Delphi-Quellcode:
for i:= 0 to 3 do
 for j:= 0 to 4 do
  Beep;
macht mal Haltepunkt auf Beep und schaut was i für en Wert hat.. :stupid: bei mir es es auch 4

in diesem Fall ist es eine Compiler-Optimierung von Delphi... da die Werte von I bei den Schleifendurchgängen eh niemanden interessiert, baut der Compiler folgendes Konstrukt:
Delphi-Quellcode:
I:=4;
Repeat
  for j:= 0 to 4 do Beep;

  Dec(I);
Until (I = 0);
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)...

Chewie 3. Feb 2006 15:25

Re: for i:=0 to 3 do => wieso wird i = 4?
 
Zitat:

Zitat von Nogge
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!

Wenn du kein Range-Checking aktiviert ist, ist das nicht unglaublich, sondern gewollt ;)

Nogge 3. Feb 2006 15:57

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 06:03 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz