![]() |
Record-Array über Zeiger parsen
Hallo,
ich stehe mal wieder vor einem kleinen Problemchen: Ich möchte ein Array schnellstmöglich durchsuchen. Dafür bietet sich ja das iterative parsen per Zeiger an. Mit PChars, PIntegers und PStrings etc. hat das auch problemlos funktioniert. Nur will es mir bei record-Arrays nicht gelingen. Mein Code sieht wie folgt aus:
Delphi-Quellcode:
So funktioniert das schonmal nicht. Nachdem ich das Current := PData(Data) durch ein Current := @Data[Low(Data)] ersetzt habe, schien es zu gehen. Allerdings auch nur bis zu dem Inc(Current), dann kamen wieder vollkommen falsche Referenzen zustande.
type
PData = ^TData; TData = record Value: Byte; Reference: Pointer; end; var Data: array of TData; Current: PData; begin Data := //... Current:= PData(Data); while Current^.Reference <> nil do begin //... Inc(Current); end; end; Auch ein Inc(Current,SizeOf(TData)) konnte das Problem nicht beheben. Kann mir einer bitte sagen, was ich falsch mache? Danke! |
AW: Record-Array über Zeiger parsen
Moin Dennis,
funktioniert doch
Delphi-Quellcode:
type
PData = ^TData; TData = record Value: Byte; Reference: Pointer; end; procedure TForm1.btn1Click(Sender: TObject); var Data: array of TData; Current: PData; begin SetLength(Data,3); Data[0].Value := 1; Data[1].Value := 2; Data[2].Value := 3; Data[0].Reference := Pointer(100); Data[1].Reference := Pointer(200); Data[2].Reference := nil; Current:= PData(Data); while Current^.Reference <> nil do begin ShowMessage(IntToStr(Current.Value)); Inc(Current); end; end; |
AW: Record-Array über Zeiger parsen
Hm. :gruebel: Das ist ja seeeehr merkwürdig. Dieser Code geht indertat.
Bei mir geht ein ähnliches Beispiel aber nicht. Dann muss ich wohl den originalen Quelltext posten...
Delphi-Quellcode:
interface
type PCommand = ^TCommand; TCommand = record Name: Byte; Parameter: Pointer; end; TData = record Variables: array of Integer; Commands: array of PCommand; end; TMap = class private FData: TData; procedure LoadFromFile(const FileName: String); end; implementation procedure TMap.LoadFromFile(const FileName: String); var Labels: array of PCommand; CurrentLabel: ^PCommand; Command: PCommand; begin Labels := //... //Create empty last object for recognition SetLength(FData.Commands,Length(FData.Commands) + 1); //Replace label names in parameters with target addresses if Length(Labels) <> 0 then begin SetLength(Labels,Length(Labels) + 1); Command := PCommand(FData.Commands); while Command^.Parameter <> nil do begin if Command^.Name in [17,18] then begin //... end; Inc(Command); end; end; end; |
AW: Record-Array über Zeiger parsen
Zitat:
![]() Was Du meinst, nennt sich 'iterieren': ![]() ;-) |
AW: Record-Array über Zeiger parsen
Moin Dennis,
bist Du sicher, dass
Delphi-Quellcode:
so richtig ist, und nicht etwa
Commands: array of PCommand;
Delphi-Quellcode:
Commands: array of TCommand;
|
AW: Record-Array über Zeiger parsen
Zitat:
Zitat:
Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 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