Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Bereichsprüfung geht nicht wirklich (https://www.delphipraxis.net/60394-bereichspruefung-geht-nicht-wirklich.html)

fkerber 6. Jan 2006 10:45


Bereichsprüfung geht nicht wirklich
 
Hi!

Ich nutze D7 Pro und habe das RangeChecking aktiviert. Trotzdem trat folgende Situation auf:

Delphi-Quellcode:
   while j < length(kante)-1+i do  // j=i+2;
    begin
     setlength(save, j-i-1);
     save[j-2]:=kante[j-1];
[... ]
Im Fall i=0 ging das ganze gut. Länge von save war 1, an stelle 0 konnte ich also schreiben. Bei i=1 gings ja dann schief. Länge war 1 (3-1-1), er versuchte aber an Stelle 1 (3-2) zu schreiben.
Es kam zu keiner Fehlermeldung, allerdings hat natürlich der weitere Programmablauf "Schaden" genommen, da ja in Save was falsches drinstand.

Delphi-Quellcode:
   while j < length(kante)-1+i do
    begin
     setlength(save, j-i-1);
     save[j-2-i]:=kante[j-1];
[... ]
Wieso warnt mich die Bereichsprüfung da nicht? Geht das nur bei statischen arrays?
Wie kann man solche Fehler verhindern?`


Ciao Frederic

jim_raynor 6. Jan 2006 10:50

Re: Bereichsprüfung geht nicht wirklich
 
Ich weiß nicht, obs daran liegt, aber nach dem man die Option aktiviert/deaktiviert hat, sollte man das Projekt komplett neu erzeugen. Vorher zieht die Option nicht richtig. Aber eigentlich müsste diese auch dynamischen Arrays funktionieren ...

fkerber 6. Jan 2006 10:55

Re: Bereichsprüfung geht nicht wirklich
 
HI!

Ich habs jetzt auch mal neu erzeugen lassen, es hat sich aber nichts geändert. Er wirft halt später irgendwann ne Zugriffsverletzung raus, aber von ner "Warnung" keine Spur.


Ciao Frederic

jim_raynor 6. Jan 2006 11:01

Re: Bereichsprüfung geht nicht wirklich
 
MMh. Wird die vielleicht durch irgendeine eingebundene Unit/Datei mit der Compilerdirektive ({$R-} bzw. {$RANGECHECK OFF}) deaktiviert? Versuche doch mal vor dem entsprechenden Codeschnipsel die explizit zu aktivieren {$R+}. Dann sollte man ja merken, ob die wirklich Fehlerhaft ist, oder einfach nur deaktiviert wurde ...

P.S: Willst mal nicht deine Signatur aktualisieren? :mrgreen:

alzaimar 6. Jan 2006 11:05

Re: Bereichsprüfung geht nicht wirklich
 
Zitat:

Zitat von jim_raynor
Vorher zieht die Option nicht richtig. Aber eigentlich müsste diese auch dynamischen Arrays funktionieren ...

Nein. Der Compiler fügt bei aktivierter Bereichsüberprüfung nur bei statischen Arrays Prüfcode mit ein.

fkerber 6. Jan 2006 11:06

Re: Bereichsprüfung geht nicht wirklich
 
Hi!

Nein, auch ein explizites {$R+} bewirkt keine Änderung!

Ah, ein roter Kasten:
@alzaimar:
also bei dynamischen keine Chance? Gut zu wissen!


Ciao Frederic


P.S.: Wenn da nur noch steht "Wir sind Weltmeister geworden", dann weiß ja keiner, um was es geht. Vielleicht sollte ich nur mal hinter "Osaka/Japan" ein 'gewesen' schreiben! ;)

tomsel 6. Jan 2006 11:35

Re: Bereichsprüfung geht nicht wirklich
 
Nach kurzem lesen deises Codes kommt mir der Verdacht, du hast einfach nur vergessen, dass der Indexbereich des Arrays bei 0 beginnt und NICHT bei 1. Kann das sein?

alzaimar 6. Jan 2006 12:24

Re: Bereichsprüfung geht nicht wirklich
 
Zitat:

Zitat von fkerber
@alzaimar: also bei dynamischen keine Chance? Gut zu wissen!

Hatte den gleichen Fehler, wie Alle Anderen: Mein Delphi hatte die Änderungen nicht übernommen!

Es wird sehr wohl eine Bereichsüberprüfung mit eingebaut!

Also: Sowohl bei statischen, als auch bei dynamischen Arrays wird bei eingeschaltetem RangeCheck eine Bereichsüberprüfung mit compiliert. Breakpoint auf die Stelle und dann Ctrl+Alt+C, um das CPU-Fenster zu öffnen. Selbst wenn man (wie ich) keine Ahnung von Assembler hat, sieht man doch ein jmp @BoundsErr, was jeder leicht als 'Bereichsüberprüfung' interpretieren kann. Der Code verschwindet, wenn man die Option wieder ausschaltet, UND PER BUILD den gesamten Code wieder compiliert. Es sollte zwar reichen, nur die unit neu zu kompilieren, aber sicher ist sicher.

Wenn das bei Dir nicht klappt, dann hast du, wie bereits bemerkt vorher irgendwo im Code ein $R-

klammere einfach den Codeteil in $R+ / $R- ein.

fkerber 6. Jan 2006 12:49

Re: Bereichsprüfung geht nicht wirklich
 
Hi!

@tomsel:
Ich hab doch oben geschrieben:


Zitat:

Zitat von fkerber
Im Fall i=0 ging das ganze gut. Länge von save war 1, an stelle 0 konnte ich also schreiben. Bei i=1 gings ja dann schief. Länge war 1 (3-1-1), er versuchte aber an Stelle 1 (3-2) zu schreiben.


Ciao Frederic


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 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