Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Länge zwei dimensionaler, dynamischer Arrays bestimmen ? (https://www.delphipraxis.net/113470-laenge-zwei-dimensionaler-dynamischer-arrays-bestimmen.html)

Andy386 8. Mai 2008 11:13


Länge zwei dimensionaler, dynamischer Arrays bestimmen ?
 
Hallo,
ich habe ein dynamisches Array gemacht:
Delphi-Quellcode:
dynMatrix = array of array of double;
....
SetLength(dynmat^, xdim, ydim);
und würde in einer anderen Funktion, ohne die Parameter übergeben zu müssen oder in dem Array zu speichern, xdim und ydim herausbekommen.

Delphi-Quellcode:
Length(dynmat^)
liefert nur einen double-wert zurück...

mkinzler 8. Mai 2008 11:16

Re: Länge zwei dimensionaler, dynamischer Arrays bestimmen ?
 
Spalte auf

Delphi-Quellcode:
TZeile = array of double;
TDynMatrix = array of TZeile;

Andy386 8. Mai 2008 11:17

Re: Länge zwei dimensionaler, dynamischer Arrays bestimmen ?
 
Ach so ! :wall:

marabu 8. Mai 2008 12:45

Re: Länge zwei dimensionaler, dynamischer Arrays bestimmen ?
 
Hallo,

erst die Zeilen, dann die Spalten indizieren - und keine Dereferenzierung:

Delphi-Quellcode:
type
  TDoubleMatrix = array of array of Double;
var
  mat: TDoubleMatrix;
  xDim, yDim: Integer;
begin
  SetLength(mat, 42, 17);
  yDim := Length(mat);
  xDim := Length(mat[Low(mat)]);
end;
Freundliche Grüße

Andy386 8. Mai 2008 14:13

Re: Länge zwei dimensionaler, dynamischer Arrays bestimmen ?
 
Das ist natürlich noch schöner !
Vielen Dank !

Die Dereferenzierung muss aber scheinbar schon sein, ich habe das oben vergessen zu schreiben, ich habe für die Funktionen nur Pointer zu den Arrays übergeben.
Sorry wegen eventueller Missverständnisse

marabu 8. Mai 2008 17:32

Re: Länge zwei dimensionaler, dynamischer Arrays bestimmen ?
 
Statt eines Pointers könntest du die Matrix auch als var-Parameter übergeben.
Das wäre dann Call-By-Reference nach Pascal Art.

Delphi-Quellcode:
procedure MatrixMultiply(var mat: TDoubleMatrix; scalar: Double);
var
  yDim, xDim: Integer;
begin
  for yDim := Low(mat) to High(mat) do
    for xDim := Low(mat[yDim]) to High(mat[yDim]) do
      mat[yDim, xDim] := mat[yDim, xDim] * scalar;
end;


procedure Test;
var
  yDim, xDim: Integer;
  mat: TDoubleMatrix;
begin
  SetLength(mat, 3, 3);
  for yDim := Low(mat) to High(mat) do
    for xDim := Low(mat[yDim]) to High(mat[yDim]) do
      mat[yDim, xDim] := 1;
  MatrixMultiply(mat, 2);
  ShowMessage(FloatToStr(mat[0, 0]));
  SetLength(mat, 0, 0);
end;
Getippt und nicht getestet.

Andy386 13. Mai 2008 14:21

Re: Länge zwei dimensionaler, dynamischer Arrays bestimmen ?
 
Aber das ist dann intern dasselbe, oder wird die ganze Matrix dabei kopiert?

Dax 13. Mai 2008 15:17

Re: Länge zwei dimensionaler, dynamischer Arrays bestimmen ?
 
Arrays mit statischen Grenzen (array [n..m{, x..y}]) sind Datenblöcke - bei einem "var" oder "const"-Parameter werden Referenzen übergeben, ansonsten wird kopiert.
Dynamische Arrays sind aber an sich schon Referenzen, der Geschwindigkeitsvorteil gegenüber den statischen Arrays ist also bei CallByRef nicht gegeben - dafür kann man aber *sicher* das übergebene Array bearbeiten (var) ohne es zu kopieren, oder man *darf* es nicht bearbeiten (const).


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