Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Unerwartetes Phänomen bei zwei aufeinander folgenden Schleif (https://www.delphipraxis.net/148133-unerwartetes-phaenomen-bei-zwei-aufeinander-folgenden-schleif.html)

Gelmo 23. Feb 2010 13:27


Unerwartetes Phänomen bei zwei aufeinander folgenden Schleif
 
Hallo!
Folgendes Phänomen, das zu anderen Ergebnissen führt, als ich erreichen möchte, kann ich mir nicht erklären:
nachdem ich Daten in einen Datensatz eingegeben habe, soll dieser neu sortiert werden. Anschließend sollen die sortierten Daten z.B. auf dem Bildschirm neu ausgegeben werden. Ein angedeutetes Beispiel:
Delphi-Quellcode:
var
  Text : Array[0..10] of String;

// Schleife 1
for ui:=1 to 10 do begin
  for uj:=ui+1 to 10 do begin
    if Text[uj]<Text[ui] then begin
      Text[0]:=Text[ui];
      Text[ui]:=Text[uj];
      Text[uj]:=Text[0];
    end;
  end;
end;
// Schleife 2
for ui:=1 to 10 do begin
  Label[ui].Caption:=InttoStr(ui)+'.';
  Label[10+ui]:=Text[ui];
end;
Das Programm ist etwas komplizierter, so wird dort in Schleife 1 dafür gesorgt, dass leere Strings nach hinten sortiert werden, in Schleife 2 werden die entsprechenden Felder mit einem leeren String gefüllt.

Beim Debuggen stellte ich fest, dass in Schleife 2 die Zählreihenfolge umgekehrt ist, so dass ui im ersten Durchlauf nicht - wie vorgegeben - den Wert 1 enthält, sondern 10 und dann heruntergezählt wird. Auch wenn ich in Schleife 2 ui durch eine andere Variable, z.B. Loop1, ersetze, tritt dieses Phänomen auf. Ich komme nicht weiter und finde keine Erklärung.
Hat jemand einen Tipp, wie das passieren kann? Ich möchte noch darauf hinweisen, dass beide Schleifen nicht innerhalb einer weiteren Schleife stehen, sondern in einer eigenen Unit ausgeführt werden.
Vielen Dank für eure Unterstützung.
MfG Gelmo

[edit=Sharky]Delphi-Tags eingefügt. Mfg, Sharky[/edit]

Luckie 23. Feb 2010 13:39

Re: Unerwartetes Phänomen bei zwei aufeinander folgenden Sch
 
Optimierung durch den Compiler: http://www.michael-puff.de/Artikel/ForRueckwaerts.shtml

himitsu 23. Feb 2010 13:41

Re: Unerwartetes Phänomen bei zwei aufeinander folgenden Sch
 
Zitat:

Beim Debuggen stellte ich fest, dass in Schleife 2 die Zählreihenfolge umgekehrt ist,
Zeigt das "nur" der Hint im Debugger so an oder ist das wirklich so?

Die Compiler optimieren an vielen Stellen und lassen so auch mal "intern" Schleifen rückwärts laufen, aber bei Verwendung der Schleifenvariable wird diese dennoch richtig verwendet (entsprechend umgerechnet).

Laß dir mal den Wert ausgeben ... z.B. über eine MessageBox .

[add]
so viel Rot, da hab'sch den Glücklichen glatt übersehn

hoika 23. Feb 2010 13:47

Re: Unerwartetes Phänomen bei zwei aufeinander folgenden Sch
 
Hallo,

Delphi-Quellcode:
for ui:=1 to 10 do
begin
  Label[ui].Caption:=InttoStr(ui)+'.';
  Label[10+ui]:=Text[ui];
end;

Delphi-Quellcode:
for ui:=10 downto 1 do
begin
  Label[ui].Caption:=InttoStr(ui)+'.';
  Label[10+ui]:=Text[ui];
end;

Es kommt beides mal, das gleiche raus.
Der Compiler weiss das auch und optimiert das.


Heiko

Luckie 23. Feb 2010 13:51

Re: Unerwartetes Phänomen bei zwei aufeinander folgenden Sch
 
Zitat:

Zitat von himitsu
Laß dir mal den Wert ausgeben ... z.B. über eine MessageBox

Dann wird der Compiler aber wieder dafür sorgen, dass die Schleife richtig rum läuft. Heisenberg lässt grüßen. ;)

isilive 23. Feb 2010 14:02

Re: Unerwartetes Phänomen bei zwei aufeinander folgenden Sch
 
Vielleicht kannst du die Schleifen mit repeat .. until umbauen.
Oder du schreibst von vorneherein das hier. Dann gibt's keine Überraschungen.
Delphi-Quellcode:
for ui := 10 downto 1 do
Hier geht es auch um diese Compileroptimierung der For-Schleifen. Die gute Nachricht -> man kann sie mit einer Compilerdirektive ausschalten.

Zitat:

Zitat von JasonDX
Du musst aber nicht zwingend auf die For-Schleife verzichten. Per Compilerdirektiven {O+-} kannst du die Optimierung für bestimmte Codeblöcke ausschalten.

edit: Aber wie es sich auch hier herrausstellt, das ganze wäre dann eher kosmetischer Natur. Negative Auswirkungen im Programmfluss durch diese Optimierung sind sehr selten.

Das ist mein 100.ter Post! :mrgreen: :zwinker:

Gelmo 23. Feb 2010 14:04

Re: Unerwartetes Phänomen bei zwei aufeinander folgenden Sch
 
Hallo!
Tatsächlich zeigt nur der Hint den bemängelten Wert. ShowMessage zeigt die richtige Reiehnfolge. Dann muss da ein anderer Fehler bei der Sortierung vorliegen, denn die Leerzeilen, die ich vor der Sortierung mit 'ZZZZZZZZZZZZZZZZZZZZ' gefüllt hatte und vor dem Anzeigen diesen String wieder durch einem Leerstring ersetzt habe, stehen vorn. Nach dem Sortieralgorithmus sollten sie doch hinten stehen. Da schien mir die falsche Anzeige der Schleifenvariable eine Erklärung für den Fehler.
Vielen Dank für den Tipp!
MfG Gelmo


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 Uhr.

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