在 Delphi 中将静态数组作为动态数组的参数传递

问题描述 投票:0回答:4

我有这个数组:

const / var
  _Data : array [0..4] of array [0..3] of Double =
    ((0,0,0,0),
     (0,0,1,1),
     (1,0,1,0),
     (1,1,0,0),
     (1,1,1,1));

我想将其作为此过程的参数值传递:

procedure NN.NetTraining(Data: TDoubleMatrix);

地点:

  TDoubleArray    = array of Double;
  TDoubleMatrix   = array of TDoubleArray;

是否有某种方式可以在 Delphi (2009) 中将此静态数组强制转换或转换为动态数组?

提前致谢。

delphi arrays dynamic static
4个回答
3
投票

虽然这并不完全符合您的要求(由于 Gamecat 的答案中给出的原因),但它可能是您初始化动态数据数组的可行解决方法:


var Data:TDoubleMatrix;
begin
  Data:=TDoubleMatrix.create(TDoubleArray.create(0,0,0,0),
                             TDoubleArray.create(0,0,1,1),
                             TDoubleArray.create(1,0,1,0),
                             TDoubleArray.create(1,1,0,0),
                             TDoubleArray.create(1,1,1,1));
end;


1
投票

动态数组与普通数组不同。

动态数组是指针,而普通数组是内存块。对于一维数组,您可以使用数组的地址。但对于多维数组,这个技巧不起作用。

在您的情况下,我将使用一个文件来初始化数组。因此您可以 100% 地使用动态数组。否则你必须编写自己的转换,这违背了动态数组的目的。


0
投票

您无法投射,但可以复制!类似...

    procedure CopyDMatrix(var Source; LengthX, LengthY: integer; var Dest: TDoubleMatrix);
    const
      SizeOfDouble = SizeOf(Double);
    var
      n  : integer;
      ptr: pointer;
    begin
      SetLength(Dest, LengthX);
      Ptr := @Source;
      for n := 0 to LengthX - 1 do begin
        SetLength(Dest[n], LengthY);
        Move(ptr^, Dest[n][0] , SizeOfDouble * LengthY);
        inc(cardinal(ptr), SizeOfDouble * LengthY);
      end;
    end;

    //...  

    CopyDMatrix(Data, Length(Data), Length(Data[0]), DoubleMatrix);

-1
投票

也许你应该使用开放数组来代替?

© www.soinside.com 2019 - 2024. All rights reserved.