Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Problem wenn Compiler Optimierung aktiv (https://www.delphipraxis.net/181206-problem-wenn-compiler-optimierung-aktiv.html)

delphia 24. Jul 2014 19:49

Problem wenn Compiler Optimierung aktiv
 
Hallo,

folgende Routine macht Probleme wenn ich den Compiler Direktiven die Optimierung einschalte. Ich erhalte die Fehlermedung "Eintrag kann nicht eingefügt werden". Ist die Optimierung ausgeschaltet läuft alles gut.

Es handelt sich um ein normales TTreeview, als Start Parameter für ParentNode wird nil übergeben.

LoadFolder(nil, NameSpace.Folders);


Code:
procedure LoadFolder(ParentNode: TTreeNode; Folder: OleVariant);
  var
    i: Integer;
    node: TTreeNode;
    li :string;
  begin
    for i := 1 to Folder.Count do
    begin
      li := Folder.Item[i].DefaultMessageClass;
      if AnsiSameText(li,'IPM.Contact') then
        node := tvFolders.Items.AddChild(ParentNode{ nd }, Folder.Item[i].Name);

      LoadFolder(node, Folder.Item[i].Folders);
    end;
  end;
Mir scheint es so zu sein, dass beim rekursiven Aufruf der Bezug zum TreeView verloren geht.
Jemand eine Idee?
Plattform: D5 unter Win7.

Gruss Thomas

Stevie 24. Jul 2014 21:52

AW: Problem wenn Compiler Optimierung aktiv
 
Ist das gewollt, dass die Schleife von 1 bis Count zählt und nicht von 0 bis Count-1?

Uwe Raabe 24. Jul 2014 21:53

AW: Problem wenn Compiler Optimierung aktiv
 
Wenn nicht zufällig der erste Node auf die if-Bedingung passt, ist node nicht definiert. Was auch immer da drin steht kann mit und ohne Optimierung anders sein.

Stevie 24. Jul 2014 22:02

AW: Problem wenn Compiler Optimierung aktiv
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1266597)
Wenn nicht zufällig der erste Node auf die if-Bedingung passt, ist node nicht definiert. Was auch immer da drin steht kann mit und ohne Optimierung anders sein.

Stimmt, sollte das nicht auch in D5 schon vom Compiler mit einem "W1036 Variable 'node' might not have been initialized" quittiert werden?

delphia 25. Jul 2014 11:22

AW: Problem wenn Compiler Optimierung aktiv
 
Hallo,

Das Problem ist gelöst. Die fehlende Initialisierung von node war das Problem. Manchmal sieht man den Wald wegen der Bäume nicht. Was mich jedoch verwirrte, war der Umstand, dass bei ausgeschalteter Optimierung alles wunschgemäß war. Sonst wäre ich vielleicht noch selbst drauf gekommen.
Danke.

Gruss

Der schöne Günther 25. Jul 2014 11:26

AW: Problem wenn Compiler Optimierung aktiv
 
Zitat:

Zitat von delphia (Beitrag 1266641)
Manchmal sieht man den Wald wegen der Bäume nicht.

Manchmal sieht man eine neue Warnung vor lauter anderer Warnungen nicht. :oops: 8-)

himitsu 25. Jul 2014 12:10

AW: Problem wenn Compiler Optimierung aktiv
 
Ohne Optimierung ist die Lebensdauer von lokalen Variablen fast immer von BEGIN bis END.

Mit Optimierung sagt sich Delphi "vor der ersten und nach der letzen Benutzung brauch ih diese Variable eh nicht mehr, also fliegt sie raus. und wenn ich glück hab, dann kann das ich auch nur mal kurz in ein Register schupsen, ohne daß ich wertvollen Stack dafür verschwenden muß.".
(es gibt nur ein paar gemanagte Typen, die immer etwas aus der Reihe tanzen, z.B. lange Strings, dynArrays und Interfaces)


Und wenn man die Warnungen beachtet, dann verändert die Optimierung das Verhalten eigentlich nicht.

Stevie 25. Jul 2014 12:25

AW: Problem wenn Compiler Optimierung aktiv
 
Zitat:

Zitat von himitsu (Beitrag 1266648)
ohne daß ich wertvollen Sack dafür verschwenden muß.

:mrgreen: :lol:


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