Passing Static arrays as parameters for Dynamic arrays in Delphi

我们两清 提交于 2019-12-19 07:27:14

问题


I have this array:

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

I wanna pass it as param value for this procedure:

procedure NN.NetTraining(Data: TDoubleMatrix);

Where:

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

Is There some manner to cast or convert this static array into dynamic array in Delphi (2009) ?

Thanks in advance.


回答1:


While this does not do exactly what you want (for reasons given in Gamecat's answer), it may be a viable work-around for you to initialise your dynamic data array:


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;



回答2:


Dynamic arrays differ from normal arrays.

Dynamic arrays are pointers, while normal arrays are blocks of memory. With one dimensional arrays, you can use the address of the array. But with multi dimensional arrays this trick won't work.

In your case, I would use a file to initialize the array. So you can use dynamic arrays 100% of the time. Else you have to write your own conversion which kind of defeats the purpose of dymanic arrays.




回答3:


You can't cast but you can copy! Something like...

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



回答4:


May be you should use open arrays instead?



来源:https://stackoverflow.com/questions/1593535/passing-static-arrays-as-parameters-for-dynamic-arrays-in-delphi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!