AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ein neues Problem mit dyn. Arrays

Ein Thema von sonicfire · begonnen am 11. Aug 2006 · letzter Beitrag vom 11. Aug 2006
Antwort Antwort
sonicfire

Registriert seit: 17. Jan 2006
Ort: Berlin
58 Beiträge
 
#1

Ein neues Problem mit dyn. Arrays

  Alt 11. Aug 2006, 18:09
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:
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:
`_'.} (soll symbolisieren das murks rauskommt)

---

Kann mir jemand helfen? Versteh ich da etwas gänzlich falsch?
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Ein neues Problem mit dyn. Arrays

  Alt 11. Aug 2006, 18:14
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 mitWrite*(buffer, sizeof(buffer)); zu schreiben, musst du mitWrite*(buffer[0], Length(buffer)*sizeof(buffer[0])); schreiben.
  Mit Zitat antworten Zitat
sonicfire

Registriert seit: 17. Jan 2006
Ort: Berlin
58 Beiträge
 
#3

Re: Ein neues Problem mit dyn. Arrays

  Alt 11. Aug 2006, 18:23
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!!
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: Ein neues Problem mit dyn. Arrays

  Alt 11. Aug 2006, 18:32
Hallo,
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
sonicfire

Registriert seit: 17. Jan 2006
Ort: Berlin
58 Beiträge
 
#5

Re: Ein neues Problem mit dyn. Arrays

  Alt 11. Aug 2006, 18:34
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 ... ?

EDIT: okay, denkfehler ... war ja ein statischer array... dafür SIND ja dynamische arrays ... *G*
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: Ein neues Problem mit dyn. Arrays

  Alt 11. Aug 2006, 18:38
Hallo,
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
I am a leaf on the wind - watch how I soar
  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 01:47 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