Hi!
Mein Vorschlag wäre erstmal:
Delphi-Quelltext
1: 2:
| SetLength(Buffer, bytesRead); regist.ReadBinaryData(Value, Buffer[0], bytesRead); |
Hintergrund: untypisierte Parameter sind sowas ähnliches wie Pointer, die auf der andern Seite direkt dereferenziert werden. Du willst hier also die das erste Element angeben. Bei dynamischen Arrays liegt das aber grade nicht an der Stelle, wo die Variable ist: wie bei Strings ist "Buffer" erstmal nur ein Zeiger (mit angehängter Längenangabe) auf einen Speicherbereich, wo dann die echten Daten sind.
Bei einem Array mit fester Länge würde das übrigens funktionieren, da dort die Variable direkt den Speicherbereich bezeichnet und damit immer mit dem ersten Element identisch ist, ohne die weitere Ebene Verpointerung dazwischen.
Warum funktioniert dein Pointer?
Wie erwähnt ist Buffer ein Zeiger auf einen Speicherbereich.
Pointer() (nicht
Ptr() oder
@) ist nur ein Typecast, du tust also nichts weiter, als dem Zeiger in
Buffer folgen. Genau das also was passiert, wenn du auf das erste Element zugreifst.
An der Stelle mag ich FPC auch wieder, Delphi würde den Code vermutlich anstandslos ausführen, aber er würde nicht funktionieren. Durch den SegFault weißt du wenigstens direkt, dass du irgendwo wild im Speicher rumschreibst
... und da war der
Gammatester schneller
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."