Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Repeat until high(Array) Problem (https://www.delphipraxis.net/201912-repeat-until-high-array-problem.html)

Edelfix 10. Sep 2019 08:26

Repeat until high(Array) Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich bin gestern über ein merkwürdiges Verhalten gestolpert.

In eine repeat until Schleife wurde im until Bereich mit high(aArray)>1 geprüft.

Der Compiler hat die until Prüfung einfach nicht gemacht und schon hatte ich eine Endlos Schleife.

Hier ein Beispiel:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  aArray: Array of String;
begin
  SetLength(aArray, length(aArray)+1);
  repeat
    SetLength(aArray, length(aArray)+1);
  until (high(aArray) >= 5);
end;

EmWieMichael 10. Sep 2019 08:44

AW: Repeat until high(Array) Problem
 
Initialisiere das Array doch erstmal vor der Schleife.

Edelfix 10. Sep 2019 09:02

AW: Repeat until high(Array) Problem
 
Darum geht es nicht. Es nur ein kurzes Beispiel. Es geht darum das bei until kein Blauer Punkt ist. Also wird die Zeile nicht ausgeführt.

Schokohase 10. Sep 2019 09:07

AW: Repeat until high(Array) Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Edelfix (Beitrag 1445455)
Darum geht es nicht. Es nur ein kurzes Beispiel. Es geht darum das bei until kein Blauer Punkt ist. Also wird die Zeile nicht ausgeführt.

Leider falsch.

Kein blauer Punkt => Kein Breakpoint setzbar.

Es sagt leider nichts darüber aus, ob das ausgeführt wird oder nicht. Somit ein Bug der gefixt werden sollte.

Ob da was ausgeführt wird oder nicht siehst du aber in der CPU-Ansicht.

Breakpoint auf SetLength und dann in die CPU-Ansicht wechseln. Dort sieht man dann, wo (und ob) der Vergleich stattfindet (habe ich dir mal gelb markiert).
Anhang 51627
Jetzt bekommt man auch eine Ahnung, warum in der Zeile mit dem
Delphi-Quellcode:
until
kein Breakpoint gesetzt werden kann.
Eine weitere Ahnung beschleicht einen, wenn man dann einen Breakpoint auf die Zeile mit dem
Delphi-Quellcode:
repeat
setzt. Wenn das Programm dort jetzt zum ersten Mal anhält, dann hat das Array schon eine Länge von 1.

Kleines Schmankerl noch zum Schluss:

Schau dir mal die blauen Punkte bei diesem Code an
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  aArray: Array of String;
  function IsFinished(): Boolean;
  begin
    Result := (high(aArray) >= 5);
  end;

begin
  repeat
    SetLength(aArray, length(aArray) + 1);
  until IsFinished();
end;
Die Zeile mit dem
Delphi-Quellcode:
until
hat jetzt einen blauen Punkt, dafür aber die Zeile mit dem
Delphi-Quellcode:
repeat
nicht mehr

LoZe 10. Sep 2019 09:24

AW: Repeat until high(Array) Problem
 
müsste es nicht so sein?

Delphi-Quellcode:
until (length(aArray) >= 5);
Gruß LoZe

Schokohase 10. Sep 2019 09:27

AW: Repeat until high(Array) Problem
 
Zitat:

Zitat von LoZe (Beitrag 1445458)
müsste es nicht so sein?

Delphi-Quellcode:
until (length(aArray) >= 5);
Gruß LoZe

Der Original-Code fragt ab, ob der höchste Index des Arrays größer oder gleich 5 ist. Da der Array-Index 0-basierend ist, müssten wir analog abfragen
Delphi-Quellcode:
until (length(aArray) >= 6);
.

Also lautet die Antwort auf deine Frage: Nein!

Edelfix 10. Sep 2019 09:42

AW: Repeat until high(Array) Problem
 
Schokohase hat Recht. In dem kleinen Beispiel wird until doch ausgeführt obwohl kein blauer Punkt zu sehen ist.

Bedeutet dass mein Beispiel leider nicht so gut ist.

Im konkreten Fall hat ein Kunde sich beschwert das die Ausgabe nach Excel nicht mehr funktioniert.

Mit dem Debugger habe ich dann gesehen das die Ausgabe in eine Endlos Schleife Excel vollgemacht hat.

Ich habe erst einmal den high Wert einer lokalen Variable zugewiesen und diese dann im until angefragt.

Jetzt ist der Kunde erst einmal Glücklich aber ich habe Angst das es noch weitere Stellen gibt wo änliches auftreten kann.

Leider kann ich den Original Quelltext hier nicht posten.

freimatz 10. Sep 2019 10:07

AW: Repeat until high(Array) Problem
 
Zitat:

Zitat von Edelfix (Beitrag 1445465)
Jetzt ist der Kunder erst einmal Glücklich aber ich habe Angst das es noch weitere Stellen gibt wo änliches auftreten kann.

Langfristig hilft https://clean-code-developer.de/

TigerLilly 11. Sep 2019 08:02

AW: Repeat until high(Array) Problem
 
Ich seh es nicht. :shock:

Was war am Originalcode falsch?

Schokohase 11. Sep 2019 09:28

AW: Repeat until high(Array) Problem
 
Zitat:

Zitat von TigerLilly (Beitrag 1445639)
Ich seh es nicht. :shock:

Was war am Originalcode falsch?

Nichts


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