AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi dynamisches Array, wo wird die Länge gespeichert ?
Thema durchsuchen
Ansicht
Themen-Optionen

dynamisches Array, wo wird die Länge gespeichert ?

Ein Thema von hoika · begonnen am 17. Feb 2012 · letzter Beitrag vom 17. Feb 2012
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#1

dynamisches Array, wo wird die Länge gespeichert ?

  Alt 17. Feb 2012, 12:48
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
Heiko
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: dynamisches Array, wo wird die Länge gespeichert ?

  Alt 17. Feb 2012, 12:51
Die steht in den 4 Bytes (als Integer) vor der Adresse vom ersten Arrayelement. Length := PInteger(Integer(@MyArray[0])-4)^; (ungetestet)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

AW: dynamisches Array, wo wird die Länge gespeichert ?

  Alt 17. Feb 2012, 18:20
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (17. Feb 2012 um 18:23 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz