AGB  ·  Datenschutz  ·  Impressum  







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

Repeat until high(Array) Problem

Ein Thema von Edelfix · begonnen am 10. Sep 2019 · letzter Beitrag vom 11. Sep 2019
Antwort Antwort
Seite 1 von 2  1 2      
Edelfix

Registriert seit: 6. Feb 2015
Ort: Stadtoldendorf
214 Beiträge
 
Delphi 10.4 Sydney
 
#1

Repeat until high(Array) Problem

  Alt 10. Sep 2019, 08:26
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;
Miniaturansicht angehängter Grafiken
10-09-_2019_08-19-59.jpg  

Geändert von Edelfix (10. Sep 2019 um 09:00 Uhr)
  Mit Zitat antworten Zitat
EmWieMichael

Registriert seit: 28. Mär 2012
103 Beiträge
 
#2

AW: Repeat until high(Array) Problem

  Alt 10. Sep 2019, 08:44
Initialisiere das Array doch erstmal vor der Schleife.
  Mit Zitat antworten Zitat
Edelfix

Registriert seit: 6. Feb 2015
Ort: Stadtoldendorf
214 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Repeat until high(Array) Problem

  Alt 10. Sep 2019, 09:02
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.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#4

AW: Repeat until high(Array) Problem

  Alt 10. Sep 2019, 09:07
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).
2019-09-10-09_13_55-repeat-cpu.png
Jetzt bekommt man auch eine Ahnung, warum in der Zeile mit dem until kein Breakpoint gesetzt werden kann.
Eine weitere Ahnung beschleicht einen, wenn man dann einen Breakpoint auf die Zeile mit dem 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 until hat jetzt einen blauen Punkt, dafür aber die Zeile mit dem repeat nicht mehr

Geändert von Schokohase (10. Sep 2019 um 09:25 Uhr)
  Mit Zitat antworten Zitat
LoZe

Registriert seit: 27. Dez 2016
Ort: Ulm
40 Beiträge
 
Delphi 12 Athens
 
#5

AW: Repeat until high(Array) Problem

  Alt 10. Sep 2019, 09:24
müsste es nicht so sein?

until (length(aArray) >= 5); Gruß LoZe
Chris
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#6

AW: Repeat until high(Array) Problem

  Alt 10. Sep 2019, 09:27
müsste es nicht so sein?

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 until (length(aArray) >= 6); .

Also lautet die Antwort auf deine Frage: Nein!
  Mit Zitat antworten Zitat
Edelfix

Registriert seit: 6. Feb 2015
Ort: Stadtoldendorf
214 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Repeat until high(Array) Problem

  Alt 10. Sep 2019, 09:42
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.

Geändert von Edelfix (10. Sep 2019 um 10:54 Uhr)
  Mit Zitat antworten Zitat
freimatz
Online

Registriert seit: 20. Mai 2010
1.446 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Repeat until high(Array) Problem

  Alt 10. Sep 2019, 10:07
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/
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Repeat until high(Array) Problem

  Alt 11. Sep 2019, 08:02
Ich seh es nicht.

Was war am Originalcode falsch?
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#10

AW: Repeat until high(Array) Problem

  Alt 11. Sep 2019, 09:28
Ich seh es nicht.

Was war am Originalcode falsch?
Nichts
  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 15:10 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