AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Nogge · begonnen am 3. Feb 2006 · letzter Beitrag vom 3. Feb 2006
Antwort Antwort
Seite 1 von 2  1 2      
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#1

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

  Alt 3. Feb 2006, 15:20
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
Miniaturansicht angehängter Grafiken
sehr_seltsam_108.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

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

  Alt 3. Feb 2006, 15:25
Wenn du aus Versehen irgendwo Speicherbereiche überschreibst, kann dir alles gelingen . Eine andere Möglichkeit fällt mir gerade auch nicht ein (es sei denn, du manipulierst i absichtlich ).
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#3

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

  Alt 3. Feb 2006, 15:26
RangeChecks aktiviert?
Einer deiner Container kann, dir in dein "i" hineinschreiben.
Robert Giesecke
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

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

  Alt 3. Feb 2006, 15:29
Schalt mal die Optimierungen aus, sonst kann der Debugger keine praezisen Daten anzeigen.
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#5

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

  Alt 3. Feb 2006, 15:34
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.
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#6

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

  Alt 3. Feb 2006, 15:57
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.. 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.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#7

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

  Alt 3. Feb 2006, 16:07
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!
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#8

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

  Alt 3. Feb 2006, 16:18
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.. 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)...
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#9

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

  Alt 3. Feb 2006, 16:25
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
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#10

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

  Alt 3. Feb 2006, 16:57
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 Uhr.
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