Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ein neues Problem mit dyn. Arrays (https://www.delphipraxis.net/74953-ein-neues-problem-mit-dyn-arrays.html)

sonicfire 11. Aug 2006 18:09


Ein neues Problem mit dyn. Arrays
 
Hi allerseits!

Ich mach´s kurz:
Delphi-Quellcode:
type
  TTestTyp = record
    TestDaten: Array [0..4] of Char; // <<<<<<<<<<<<<<<<<<<<
end;

(...)

var
  TestTyp: TTestTyp;
begin
  TestTyp.TestDaten[0] := 'H';
  TestTyp.TestDaten[1] := 'a';
  TestTyp.TestDaten[2] := 'l';
  TestTyp.TestDaten[3] := 'l';
  TestTyp.TestDaten[4] := 'o';
Ergebnis via WriteBuffer(TestTyp, sizeOf(TestTyp)) (in leere Datei) im HEX-Editor:
Delphi-Quellcode:
Hallo
---

Aber:
Delphi-Quellcode:
type
  TTestTyp = record
    TTestDaten: Array of Char; // <<<<<<<<<<<<<<<<<<<<
end;

(...)

var
  TestTyp: TTestTyp;
begin
  SetLength(TestTyp.TestDaten, 5); // merkwürdigerweise sagt er manchmal "constant object cannot be passed as var parameter" ???
  TestTyp.TestDaten[0] := 'H';
  TestTyp.TestDaten[1] := 'a';
  TestTyp.TestDaten[2] := 'l';
  TestTyp.TestDaten[3] := 'l';
  TestTyp.TestDaten[4] := 'o';
Ergebnis via WriteBuffer(TestTyp, sizeOf(TestTyp)) (in leere Datei) im HEX-Editor:
Delphi-Quellcode:
`_'.}
(soll symbolisieren das murks rauskommt)

---

Kann mir jemand helfen? Versteh ich da etwas gänzlich falsch? :oops:

Dax 11. Aug 2006 18:14

Re: Ein neues Problem mit dyn. Arrays
 
Bei statischen Arrays liegen die Daten an einem Stück an der gegebenen Stelle im Speicher, bei einem dynamischen nur ein Zeiger darauf.

Statt also mit
Delphi-Quellcode:
Write*(buffer, sizeof(buffer));
zu schreiben, musst du mit
Delphi-Quellcode:
Write*(buffer[0], Length(buffer)*sizeof(buffer[0]));
schreiben.

sonicfire 11. Aug 2006 18:23

Re: Ein neues Problem mit dyn. Arrays
 
Danke, aber warum? Ich schreibe doch den Inhalt diese Typs in mein File, und das beinhaltet ja auch den Array? Versteh ich immer noch nicht so ganz, trotzdem danke!! :)

xaromz 11. Aug 2006 18:32

Re: Ein neues Problem mit dyn. Arrays
 
Hallo,
Zitat:

Zitat von sonicfire
Danke, aber warum? Ich schreibe doch den Inhalt diese Typs in mein File, und das beinhaltet ja auch den Array? Versteh ich immer noch nicht so ganz, trotzdem danke!! :)

bei einem dynamischen Array kann der Compiler am Anfang ja nicht wissen, wie viel Platz er reservieren muss. Deshalb ist ein solches Array eigentlich ein Pointer auf einen dynamisch allokierten Speicherbereich. Dein Record sieht intern so aus:
Delphi-Quellcode:
type
  TTestTyp = record
    TestDaten: Pointer;
end;
Wenn Du diesen Record nun in einer Datei speicherst, landen nur die vier Byte des Pointers in der Datei.

Gruß
xaromz

sonicfire 11. Aug 2006 18:34

Re: Ein neues Problem mit dyn. Arrays
 
Danke! :) Heisst das im Endeffekt, öhm ... wenn ich soetwas mache, muss ich dir Arrays aus den Typen seperat via MeinDynArray[0] usw schreiben?

Das merkwürdige ist, wenn ich den Array in diesem Type (bzw. die Größe) vordefiniere, lässt sie sich in meinem Beispiel anschließend nicht mehr ändern (?)

(SetLength(MeinType.UnterTypStaticArray, 10)) (10 als Beispiel)
Error: Constant object cannot be parsed as var parameter

Hust - öhm - was zum ... ? :wall: :oops:

EDIT: okay, denkfehler ... war ja ein statischer array... dafür SIND ja dynamische arrays ... *G* :pale:

xaromz 11. Aug 2006 18:38

Re: Ein neues Problem mit dyn. Arrays
 
Hallo,
Zitat:

Zitat von sonicfire
Danke! :) Heisst das im Endeffekt, öhm ... wenn ich soetwas mache, muss ich dir Arrays aus den Typen seperat via MeinDynArray[0] usw schreiben?

Jepp!

Records werden in der heutigen Zeit vor Allem benutzt, um bestimmte Strukturen in Dateien abzulegen (z. B. Header von Bitmaps). Hier ist die Länge jedes Feldes genau vorgegeben, und deshalb müssen keine dynamischen Strukturen verwendet werden.
Bei Strukturen mit dynamischen Feldern ist es meist einfacher, eine Klasse zu verwenden, die eine eigene Methode zum Laden und Speichern implementiert.

// Zu Deinem Edit:
Ein Array mit vorgegebener Größe ist eben im Unterschied zu einem dynamischen kein Pointer auf einen Speicherbereich, sondern liegt tatsächlich an der Stelle der Variable im Speicher. Deshalb ist auch eine Größenanpassung nicht möglich.

Gruß
xaromz


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