![]() |
Array von eigenem Record, der auch Arrays enthält
Hallo!
Ich steh grad auf dem Schlauch. Folgenden record hab ich definiert:
Delphi-Quellcode:
Hat gut funktioniert, jetzt muss ich nur die Funktionalität erweitern und wollte von dem record dann entsprechende Arrays deklarieren.
type
TMyData = record Real : Array of Double; Int : Array of Integer; end;
Delphi-Quellcode:
Wie schreibe ich denn jetzt bitte was in das Array rein?
var
Daten : Array[0..3] of TMyData; 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; |
Re: Array von eigenem Record, der auch Arrays enthält
Wie wäre es denn zunächst mit
Delphi-Quellcode:
(Ungetestet)
SetLength(Daten[0].Int,2);
|
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:
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.
for i := 0 to 4 do
begin ComPort.ReadStr(parameter, 1024); Daten[i] := getData(parameter); end; 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? |
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); |
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:
Delphi-Quellcode:
Was anderes wüsste ich im Moment auch nicht.
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; |
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. |
Re: Array von eigenem Record, der auch Arrays enthält
Zitat:
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. |
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; |
Re: Array von eigenem Record, der auch Arrays enthält
Data2 ist IMHO nur ein Pointer auf Data1.
|
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:
NICHT
SetLength(Daten[0].Int, aLänge);
Delphi-Quellcode:
SetLength(Daten[0].Int[0], aLänge);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 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