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

时间:2009-10-20 09:46:36

标签: delphi arrays dynamic static

我有这个数组:

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)中,是否有某种方法可以将此静态数组转换为动态数组?

提前致谢。

4 个答案:

答案 0 :(得分: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 :(得分:1)

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

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

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

答案 2 :(得分: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);

答案 3 :(得分:-1)

您可能应该使用open arrays吗?