![]() |
AW: Freepascal->Delphi: Pointer als Array?
Zitat:
Zitat:
Hach, ist wieder schwöööör zu erklären. P ist ein Zeiger auf das erste Element. Den generiere ich nicht selbst sondern der kommt von außen in die Prozedur. ![]() |
Ein Schritt weiter gekommen
Delphi-Quellcode:
Ich verschiebe den Zeiger in einer Schleife jeweils um eine Position anhand der Größe eines Elements. Das funktioniert sogar, nur habe ich dann eine Kopie des ursprünglichen Arrays und nicht das Original. Im Ergebnis kann ich dann zwar die Werte lesen aber nicht in das ursprüngliche Array streiben :(
procedure TForm1.Button1Click(Sender: TObject);
type TPhysicalCharWidth = Byte; TPhysicalCharWidths = Array of TPhysicalCharWidth; PPhysicalCharWidth = ^TPhysicalCharWidth; var T1, T2: TPhysicalCharWidths; P: PPhysicalCharWidth; I, Len: Integer; begin Len:= 10; SetLength(T1, I); for I:= Low(T1) to High(T1) do begin T1[I]:= I + 100; end; P:= @T1[0]; SetLength(T2, Len); T2[0]:= P^; for I:= 1 to Len - 1 do begin Integer(P):= Integer(P) + SizeOf(TPhysicalCharWidth); T2[I]:= P^; end; end; |
AW: Freepascal->Delphi: Pointer als Array?
Delphi-Quellcode:
irgendwo ist jetzt ein Konten drin ... ich lege keine Kopie an und kann zurückschreiben, wo ist mein Denkfehler?
type
TPhysicalCharWidth = Byte; TPhysicalCharWidths = Array of TPhysicalCharWidth; PPhysicalCharWidth = ^TPhysicalCharWidth; procedure Proz(p:Pointer;len:Integer); var i:Integer; begin for I := 0 to len - 1 do TPhysicalCharWidths(p)[i] := TPhysicalCharWidths(p)[i] - 17; end; procedure TForm3.Button1Click(Sender: TObject); var I: Integer; P: PPhysicalCharWidth; T: TPhysicalCharWidths; begin SetLength(t,10); for i := Low(t) to High(t) do begin t[i] := i + 17; Memo1.Lines.Add(IntToStr(t[i])); end; Proz(@T[0],Length(t)); Memo1.Lines.Add('Nach Proz'); for i := Low(t) to High(t) do begin Memo1.Lines.Add(IntToStr(t[i])); end; end; |
So, jetzt hab ichs :-)
Delphi-Quellcode:
Gelesen und geschrieben ins ursprüngliche Array of Byte. Jetzt muss ich nur noch die Adresse des ursprünglichen Zeigers P zwischenspeichern und am Ende wiederherstellen.
procedure TForm1.Button1Click(Sender: TObject);
type TPhysicalCharWidth = Byte; TPhysicalCharWidths = Array of TPhysicalCharWidth; PPhysicalCharWidth = ^TPhysicalCharWidth; var T1: TPhysicalCharWidths; P: PPhysicalCharWidth; I, Len: Integer; begin // Anzahl der Elemente festlegen Len:= 10; // Ursprungs-Array erzeugen und mit Daten belegen SetLength(T1, I); for I:= Low(T1) to High(T1) do begin T1[I]:= I + 100; end; P:= @T1[0]; // Ab hier wird nur noch mit dem Zeiger gearbeitet for I:= 0 to Len - 1 do begin Integer(P):= Integer(P) + SizeOf(TPhysicalCharWidth); P^:= P^ + 100; end; Caption:= IntToStr(T1[5]); // --> Ergibt 205 end; Meine Güte, das ist ja wirklich eine wilde Zeigerschubserei. Zwischendurch hat sich da sogar mein Virenschutz gemeldet und darin einen Trojaner erkannt. @Bummi: Jetzt hab ichs auch gesehen in deinem Code. Hast natürlich recht, ich habe die Dereferenzierung in "Proz" übersehen. Das Konstrukt ist im Originalquelltext an sich ziemlich :firejump: aber was will man machen. Es soll ja "nur" ein Backport werden und kein komplettes Rewite. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 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-2025 by Thomas Breitkreuz