Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array von eigenem Record, der auch Arrays enthält (https://www.delphipraxis.net/93404-array-von-eigenem-record-der-auch-arrays-enthaelt.html)

divBy0 5. Jun 2007 13:40


Array von eigenem Record, der auch Arrays enthält
 
Hallo!

Ich steh grad auf dem Schlauch.

Folgenden record hab ich definiert:

Delphi-Quellcode:
type
  TMyData = record
    Real : Array of Double;
    Int : Array of Integer;
  end;
Hat gut funktioniert, jetzt muss ich nur die Funktionalität erweitern und wollte von dem record dann entsprechende Arrays deklarieren.

Delphi-Quellcode:
var
  Daten : Array[0..3] of TMyData;
Wie schreibe ich denn jetzt bitte was in das Array rein?
Hab folgendes versucht, da bleibt es aber leer.

Delphi-Quellcode:
Daten[0].Int[0] := 1;
Daten[0].Int[1] := 2;
Daten[1].Int[0] := 3;
Daten[1].Int[1] := 4;

DeddyH 5. Jun 2007 13:42

Re: Array von eigenem Record, der auch Arrays enthält
 
Wie wäre es denn zunächst mit
Delphi-Quellcode:
SetLength(Daten[0].Int,2);
(Ungetestet)

divBy0 5. Jun 2007 13:53

Re: Array von eigenem Record, der auch Arrays enthält
 
Hab ich eben probiert, bringt aber auch nichts.

Hat vorher, als es noch kein "doppeltes" Array war allerdings auch ohne SetLength funktioniert.

vielleicht muss ich die Situation etwas näher erläutern:

Delphi-Quellcode:
for i := 0 to 4 do
begin
  ComPort.ReadStr(parameter, 1024);
  Daten[i] := getData(parameter);
end;
Also, hier wird ein String vom Comport gelesen und durch die Funktion getData in Integer und Double geteilt. Der Rückgabewerte der Funktion ist wieder von Typ TMyData.
Da der Type TMyData jetzt ja doch an das Array TMyData übergeben wird sollten dann auch die entsprechenden Werte in Daten[i].Int[xx] und Daten.Real[xx] abgelegt werden oder nicht?

Tyrael Y. 5. Jun 2007 13:58

Re: Array von eigenem Record, der auch Arrays enthält
 
Du muss schon Setlength benutzen aber für jedes der dynamischen Arrays

Delphi-Quellcode:
SetLength(Daten[0].Int, aLänge);
SetLength(Daten[0].Real, bLänge);
SetLength(Daten[1].Int, cLänge);
SetLength(Daten[1].Real, dLänge);
SetLength(Daten[2].Int, eLänge);
SetLength(Daten[3].Real, fLänge);

DeddyH 5. Jun 2007 14:01

Re: Array von eigenem Record, der auch Arrays enthält
 
Hmm... habe gerade noch mal einen Blick ín die OH zum Thema dynamische Arrays geworfen.
Zitat:

Das folgende Beispiel deklariert ein eindimensionales Array mit Elementen vom Typ Real:

var MyFlexibleArray: array of Real;

Diese Deklaration weist MyFlexibleArray keinen Speicherplatz zu. Um ein Array im Speicher anzulegen, rufen Sie SetLength auf.
Und zu mehrdimensionalen dynamischen Arrays gibt es noch ein Beispiel (obwohl das hier ja nicht ganz passt, da ja nur zum Teil dynamisch):
Delphi-Quellcode:
var

     A : array of array of string;
     I, J : Integer;
begin
     SetLength(A, 10);
     for I := Low(A) to High(A) do
     begin
       SetLength(A[I], I);
       for J := Low(A[I]) to High(A[I]) do
         A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' ';
     end;
end;
Was anderes wüsste ich im Moment auch nicht.

divBy0 5. Jun 2007 14:16

Re: Array von eigenem Record, der auch Arrays enthält
 
Ist es aber nicht so, dass wenn ich ein "statisches" Array mit Daten gefüllt hab und das an ein "dynamisches" Array übergebe, das Dynamische automatisch im Speicher angelegt wird?
Ich glaub so etwas hab ich in einem Buch mal gelesen, weiß aber nicht mehr wo das genau gestanden hat.

Tyrael Y. 5. Jun 2007 14:19

Re: Array von eigenem Record, der auch Arrays enthält
 
Zitat:

Zitat von divBy0
Ist es aber nicht so, dass wenn ich ein "statisches" Array mit Daten gefüllt hab und das an ein "dynamisches" Array übergebe, das Dynamische automatisch im Speicher angelegt wird?
Ich glaub so etwas hab ich in einem Buch mal gelesen, weiß aber nicht mehr wo das genau gestanden hat.

Wie soll das gehen?
Woher soll der Compiler wissen, wieviel Speicher du für das Array reservieren möchtest? Raten? :D

Jedes dynamisches Array kann seine eigene unabhängige Größe haben.
Versuch es mal so wie ich es oben gezeigt habe.

divBy0 5. Jun 2007 14:24

Re: Array von eigenem Record, der auch Arrays enthält
 
Hab ich ja versucht, geht aber leider nicht.

Ich nehme an, das der Compiler ermittelt, wie groß das zu übergebende Array ist und dann entsprechend den empfangenden Array den Platz zuweist.
Das hier funktioniert nämlich:

Delphi-Quellcode:
var
 Data1 : TMyData;
 Data2 : TMyData;

begin;
  // ... Anweisungen -> Data1.Int und Data1.Real mit Werten gefüllt
  Data2 := Data1; // Funktioniert auch ohne SetLength für Data2
end;

GTA-Place 5. Jun 2007 14:28

Re: Array von eigenem Record, der auch Arrays enthält
 
Data2 ist IMHO nur ein Pointer auf Data1.

Tyrael Y. 5. Jun 2007 14:28

Re: Array von eigenem Record, der auch Arrays enthält
 
Das was du jetzt machst ist nur eine Referenz auf das erste Record....natürlich geht das....hierbei wird kein extra Speicher geholt, sondern du verweist auf den ersten Record

Du bist dir sicher, daß du das wie ich oben gemacht hast?

Delphi-Quellcode:
SetLength(Daten[0].Int, aLänge);
NICHT

Delphi-Quellcode:
SetLength(Daten[0].Int[0], aLänge);


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr.
Seite 1 von 2  1 2      

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