Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   dynamisches Array, wo wird die Länge gespeichert ? (https://www.delphipraxis.net/166539-dynamisches-array-wo-wird-die-laenge-gespeichert.html)

hoika 17. Feb 2012 11:48

dynamisches Array, wo wird die Länge gespeichert ?
 
Hallo #,

wo speiuchert Delphi intern die Länge eines dyn. Arrays ?

Bsp.

Delphi-Quellcode:
var
  a: array of Byte;
bgin
  SetLength(a,100);
Ich möchte nicht wissen, dass ch mit Length(a) die Länge ermitteln kann,
sondern wie Delphi das intern macht.

Ich habe hier ein Problem mit einem DLL-Aufruf,
wie ein Speicherbereich benötigt wird.
Das kann ist mit einem dyn. Array (array of Byte) gemacht worden.

Am Ende der Prozedur meckert FastMM4, dass der Speicherblock korrupt ist.

Vor dem Umbau auf PChar würde ich schon gern wissen,
wie weit die DLL hier Mist macht.

PS:
Dass es die DLL ist ist eine Vermutung (ct_api),
bei allen anderen ctapi-DLL's klappt alles.

Danke


Heiko

Medium 17. Feb 2012 11:51

AW: dynamisches Array, wo wird die Länge gespeichert ?
 
Die steht in den 4 Bytes (als Integer) vor der Adresse vom ersten Arrayelement.
Delphi-Quellcode:
Length := PInteger(Integer(@MyArray[0])-4)^;
(ungetestet)

himitsu 17. Feb 2012 17:20

AW: dynamisches Array, wo wird die Länge gespeichert ?
 
siehe Unit System:
Delphi-Quellcode:
{ Dynamic array helper functions }

procedure _DynArrayHigh;
procedure _DynArrayClear(var a: Pointer; typeInfo: Pointer);
procedure _DynArrayLength;
procedure _DynArraySetLength;
procedure _DynArrayCopy(a: Pointer; typeInfo: Pointer; var Result: Pointer);
procedure _DynArrayCopyRange(a: Pointer; typeInfo: Pointer; index, count : Integer; var Result: Pointer);
procedure _DynArrayAsg;
procedure _DynArrayAddRef;
Die dyn. Array-Variable ist ein Zeiger auf den Anfang der enthaltenen Daten

Delphi-Quellcode:
record
  refCount: Integer
  length: Integer
  data: array[0..x] of ...;
end;
 
P := @data[0];
Wobei es egal ist, wie ein dyn. Array verwaltet wird.
- dynamische Arrays, Strings und Objekte sollten nicht über DLL-Grenzen hinweg verwaltet werden. (abgesehn BPLs sind im Spiel)
- SetLength macht selber nichts kaputt

Wenn, dann hat du wo Anders ein Problem.


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