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

6

我有这个数组:

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)中将这个静态数组转换为动态数组?谢谢。

请查看此处:[http://chee-yang.blogspot.com/2008/10/delphi-2009-array-is-dead-long-live.html] - Chau Chee Yang
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;


我喜欢使用动态数组创建。不幸的是,它没有免费的版本。 - Toon Krijthe
1
@Gamecat:你不需要释放动态数组。当它们超出作用域时,动态数组会自动释放,或者你可以将它们设置为nil。Create()结构只是允许你一次性初始化整个数组。 - Ken White

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

我非常确定开放数组只有一维。任何进一步的维度必须是静态或动态的。你能发一下代码来展示它是如何工作的吗? - Rob Kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接