通过静态数组作为用于在Delphi动态数组参数(Passing Static arrays as p

2019-08-21 12:10发布

我有这样的数组:

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)投或转换这种静态数组动态数组?

提前致谢。

Answer 1:

当你想要什么(在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; 



Answer 2:

动态数组从正常阵列不同。

动态阵列是指针,而正常阵列的存储器块。 随着一个维数组,你可以使用数组的地址。 但随着多维数组这一招是行不通的。

在你的情况,我会用一个文件来初始化数组。 所以,你可以使用动态数组的100%的时间。 否则,你必须写自己的转换哪种类型的失败dymanic阵列的目的。



Answer 3:

你可以不投,但你可以复制! 就像是...

    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);


Answer 4:

可能是你应该使用的开放数组呢?



文章来源: Passing Static arrays as parameters for Dynamic arrays in Delphi