【问题标题】:Setting bounds for dynamic arrays设置动态数组的界限
【发布时间】:2021-03-02 08:32:42
【问题描述】:

静态数组允许定义它们的下限和上限:

StaticArray : array[5..7] of Integer;

我不知道如何在运行时对动态数组做同样的事情。

例如,如果我需要从静态数组中复制元素,保持相同的索引,我不知道如何将其下限设置为Low(StaticArray),将上限设置为High(StaticArray)

var
  StaticArray : array[5..7] of Integer;
  DynamicArray : array of Integer;
  i : integer;
begin
  //initializing static array
  StaticArray[5] := 1;
  StaticArray[6] := 2;
  StaticArray[7] := 3;

  //setting the same length and bounds to the dynamic array
  //?

  //copying elements
  i := 0;
  for i := Low(StaticArray) to High(StaticArray) do
    DynamicArray[i] := StaticArray[i];
end;

有什么方法可以设置动态数组的下限/上限,或者它们总是将0 作为下限,将Length(Array) - 1 作为上限?

【问题讨论】:

  • 你为什么想要它?我知道下限和上限本身就是信息(即比例为1.. 6 而不是0.. 5),但这与区分定点小数和普通整数一样毫无意义。

标签: arrays delphi dynamic-arrays delphi-xe7


【解决方案1】:

每当您对 Delphi 语言有任何疑问时,都应该查阅官方文档。在这种情况下,Structured Types 上名为 Dynamic Arrays 的部分会显示以下内容:

动态数组始终是整数索引,始终从 0 开始。

【讨论】:

    【解决方案2】:

    有什么方法可以设置动态数组的上下限

    没有。

    还是他们总是将0 设为下限,将Length(Array) - 1 设为上限?

    是的。这意味着您可以这样做:

    var
      StaticArray : array[5..7] of Integer;
      DynamicArray : array of Integer;
      i : integer;
    begin
      //initializing static array
      StaticArray[5] := 1;
      StaticArray[6] := 2;
      StaticArray[7] := 3;
    
      //setting the same length and bounds to the dynamic array
      SetLength(DynamicArray, Length(StaticArray));
    
      //copying elements
      for i := Low(StaticArray) to High(StaticArray) do
        DynamicArray[i-Low(StaticArray)] := StaticArray[i];
    end;
    

    或者,只使用两个单独的索引变量:

    var
      StaticArray : array[5..7] of Integer;
      DynamicArray : array of Integer;
      i, j : integer;
    begin
      //initializing static array
      StaticArray[5] := 1;
      StaticArray[6] := 2;
      StaticArray[7] := 3;
    
      //setting the same length and bounds to the dynamic array
      SetLength(DynamicArray, Length(StaticArray));
    
      //copying elements
      j := 0;
      for i := Low(StaticArray) to High(StaticArray) do begin
        DynamicArray[j] := StaticArray[i];
        Inc(j);
      end;
    end;
    

    或者,由于您的数组包含非托管的普通类型,只需将整个循环替换为单个 Move() 调用即可:

    var
      StaticArray : array[5..7] of Integer;
      DynamicArray : array of Integer;
    begin
      //initializing static array
      StaticArray[5] := 1;
      StaticArray[6] := 2;
      StaticArray[7] := 3;
    
      //setting the same length and bounds to the dynamic array
      SetLength(DynamicArray, Length(StaticArray));
    
      //copying elements
      Move(StaticArray[Low(StaticArray)], DynamicArray[0], Length(DynamicArray) * SizeOf(Integer));
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2010-12-05
      • 1970-01-01
      • 2020-12-22
      • 2011-05-14
      • 1970-01-01
      • 2013-06-06
      相关资源
      最近更新 更多