AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Unerwartetes Phänomen bei zwei aufeinander folgenden Schleif

Unerwartetes Phänomen bei zwei aufeinander folgenden Schleif

Ein Thema von Gelmo · begonnen am 23. Feb 2010 · letzter Beitrag vom 23. Feb 2010
Antwort Antwort
Gelmo

Registriert seit: 14. Sep 2006
Ort: Niederrhein
20 Beiträge
 
Delphi 10.3 Rio
 
#1

Unerwartetes Phänomen bei zwei aufeinander folgenden Schleif

  Alt 23. Feb 2010, 13:27
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]
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Unerwartetes Phänomen bei zwei aufeinander folgenden Sch

  Alt 23. Feb 2010, 13:39
Optimierung durch den Compiler: http://www.michael-puff.de/Artikel/ForRueckwaerts.shtml
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.586 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Unerwartetes Phänomen bei zwei aufeinander folgenden Sch

  Alt 23. Feb 2010, 13:41
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.992 Beiträge
 
Delphi XE4 Professional
 
#4

Re: Unerwartetes Phänomen bei zwei aufeinander folgenden Sch

  Alt 23. Feb 2010, 13:47
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Unerwartetes Phänomen bei zwei aufeinander folgenden Sch

  Alt 23. Feb 2010, 13:51
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von isilive
isilive

Registriert seit: 15. Okt 2008
Ort: Österreich
192 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Unerwartetes Phänomen bei zwei aufeinander folgenden Sch

  Alt 23. Feb 2010, 14:02
Vielleicht kannst du die Schleifen mit repeat .. until umbauen.
Oder du schreibst von vorneherein das hier. Dann gibt's keine Überraschungen.
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 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!
Stefan
Jedoch kann die referenzbasierte Implementierung des Standard-Objektmodells in Kombination mit den komplexen syntaktischen Dereferenzierungsregeln bei einer objektorientierten API wie ein Stolperstein wirken.
  Mit Zitat antworten Zitat
Gelmo

Registriert seit: 14. Sep 2006
Ort: Niederrhein
20 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Unerwartetes Phänomen bei zwei aufeinander folgenden Sch

  Alt 23. Feb 2010, 14:04
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 11:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf