Einzelnen Beitrag anzeigen

Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#28

Re: Eine Frage der Performance - T(Object)List oder Dyn. Arr

  Alt 15. Mai 2009, 12:03
Ok, danke.

Allerdings habe ich das irgendwie noch nicht ganz auf der Reihe. Folgender Ablauf:

Der Node wird erstellt:

Delphi-Quellcode:
fORPNode := TORPNode.Create;
fORPNode.Subnodes := TObjectList.Create;
Anschließend wird er über eine Schleife mit Daten gefüllt:

Delphi-Quellcode:
       
       if fRegAttrExpr.Match then
          repeat
            case AnsiIndexText(fRegAttrExpr.SubExpressions[1], AllOSMElements) of

              ATTR_ID:
                begin
                  fORPNode.ID := StrToInt(fRegAttrExpr.SubExpressions[3]); //Hier steht dann z.B. 123456
                end;

              ATTR_LAT:
                begin
                  fORPNode.MercLat := StrToFloat(fRegAttrExpr.SubExpressions[3]); //Hier bspw. 53,45356645
                end;

              ATTR_LON:
                begin
                  fORPNode.MercLon := StrToFloat(fRegAttrExpr.SubExpressions[3]); //Hier bspw. 8,8234554
                end;

            end;
          until not fRegAttrExpr.MatchAgain;
Dann wird das Object zum TIntegerDictionary zugefügt:

Delphi-Quellcode:
  procedure TORPTree.AddNodeToList(Node: TORPNode);
  begin
    fNodes.Add(Node.ID, Pointer(Node));
  end;
Jetzt muss ich das Objekt wieder auslesen. Das geschieht so:

Delphi-Quellcode:
        var
ptr: Pointer;

{...}

ATTR_REF:
                  begin
                    if fORPTree.Nodes.Find(StrToInt(fRegAttrExpr.SubExpressions[3]), ptr) then
                    begin
                      fORPSubNd := TORPNode(ptr^);
                      fORPWay.SubNodes.Add(fORPSubNd);
                    end;
In fRegAttrExpr.SubExpressions[3] steht laut Debugger "20958823". Wenn ich mir jetzt im Debugger fORPSubNd anzeigen lasse, dann sieht das z.B: so aus:

Code:
fORPSubNd.ID = 1685016144
fORPSubNd.MercLat = 2,4587345897e-307
fORPSubNd.MercLon = 0
Der Eintrag wurde aber mit der o.g. genannten ID in der TIntegerDictionary gefunden, sonst wäre er ja nicht in den IF-Block gesprungen. Und theoretisch sollte in ID genau dieser Wert (20958823) stehen.

Was mache ich falsch?

P.S.: Ich vermute ja, ich schieße mit den Pointern falsch um mich. Aber eigentlich sieht das für mich ganz logisch aus.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat