【问题标题】:Passing Static arrays as parameters for Dynamic arrays in Delphi将静态数组作为参数传递给 Delphi 中的动态数组
【发布时间】:2010-12-08 06:57:16
【问题描述】:

我有这个数组:

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


【解决方案1】:

你不能投射,但你可以复制!比如……

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

【讨论】:

    【解决方案2】:

    您应该改用open arrays 吗?

    【讨论】:

    • 我很确定开放数组只是一维的。任何其他维度必须是静态的或动态的。您可以发布代码以证明它有效吗?
    【解决方案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;
    

    【讨论】:

    • 我喜欢为动态数组创建。不幸的是,没有免费的。
    • @Gamecat:你不需要免费的。动态数组超出范围时会自动释放,或者您可以简单地将它们设置为 nil。 Create() 构造只允许您一次性初始化整个数组。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      相关资源
      最近更新 更多