【问题标题】:Copy const array to dynamic array in Delphi在Delphi中将const数组复制到动态数组
【发布时间】:2010-11-02 05:08:00
【问题描述】:

我有一个固定的常量数组

constAry1: array [1..10] of byte = (1,2,3,4,5,6,7,8,9,10);

还有一个动态数组

dynAry1: array of byte;

将值从 constAry1 复制到 dynAry1 的最简单方法是什么?

如果你有一个 const 数组(多维),它会改变吗?

constArys: array [1..10] of array [1..10] of byte = . . . . .

【问题讨论】:

    标签: delphi arrays delphi-2009 constants


    【解决方案1】:

    从 Delphi XE7 开始,允许对数组使用类似字符串的操作。然后你可以直接声明一个动态数组的常量。例如:

    const
      KEY: TBytes = [$97, $45, $3b, $3e, $c8, $14, $c9, $e1];
    

    【讨论】:

      【解决方案2】:

      这会将 constAry1 复制到 dynAry

      SetLength(dynAry, Length(constAry1));
      Move(constAry1[Low(constAry1)], dynAry[Low(dynAry)], SizeOf(constAry1));
      

      【讨论】:

      • 我相信这两个答案都是正确的,所以我会接受 TOndrej 的,因为它更完整,而不是你的错(我投了赞成票)。
      • 应该是 SizeOf() 还是 Length(constAry)?
      • 实际上,为了保持一致性,您应该在两行中都使用 SizeOf 或 Length。
      • @dummzeuch 实际上,没有。第一行需要正确设置元素的数量。第二行需要移动字节数。所以第一行需要 Length,第二行需要 SizeOf (并且 SizeOf 只起作用,因为源数组是静态的,而不是动态的)。
      【解决方案3】:
      function CopyByteArray(const C: array of Byte): TByteDynArray;
      begin
        SetLength(Result, Length(C));
        Move(C[Low(C)], Result[0], Length(C));
      end;
      
      procedure TFormMain.Button1Click(Sender: TObject);
      const
        C: array[1..10] of Byte = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
      var
        D: TByteDynArray;
        I: Integer;
      begin
        D := CopyByteArray(C);
        for I := Low(D) to High(D) do
          OutputDebugString(PChar(Format('%d: %d', [I, D[I]])));
      end;
      
      procedure TFormMain.Button2Click(Sender: TObject);
      const
        C: array[1..10, 1..10] of Byte = (
          (1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
          (1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
          (1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
          (1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
          (1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
          (1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
          (1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
          (1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
          (1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
          (1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
      
      var
        D: array of TByteDynArray;
        I, J: Integer;
      begin
        SetLength(D, Length(C));
        for I := 0 to Length(D) - 1 do
          D[I] := CopyByteArray(C[Low(C) + I]);
      
        for I := Low(D) to High(D) do
          for J := Low(D[I]) to High(D[I]) do
            OutputDebugString(PChar(Format('%d[%d]: %d', [I, J, D[I][J]])));
      end;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-22
        • 2019-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多