【问题标题】:How do I assign a value to a whole array of integers?如何为整个整数数组赋值?
【发布时间】:2011-11-21 11:56:29
【问题描述】:

我知道我可以做到:

const
  arrayOfIntegers : Array[1..15] of Integer = (3,2,8,10,1,6,2,13,13,3,13,13,13,3,45);

但是我该怎么做呢?

var
  arrayOfIntegers : Array[1..15] of Integer;
begin
  arrayOfIntegers := (3,2,8,10,1,6,2,13,13,3,13,13,13,3,45);
end;

当我尝试编译上面的代码时,我得到 E2029 ')' 预期但 ',' 发现

【问题讨论】:

  • 如果您使用动态数组,您可以使用 dyn 数组构造函数。在这里,您可以声明一个 const,然后将其分配给您的变量。
  • 除了 David 的“const-and-assign”方法之外,您还必须声明一个新类型并将其用于数组 const 和 var 以使其工作。将两者都声明为 Array[1..15] of Integer 将导致“类型不兼容”错误。

标签: delphi


【解决方案1】:

您没有提及您使用的是什么 Delphi 版本,但在现代 Delphi 中您可以执行以下操作:

var
  arrayOfIntegers : TArray<Integer>;
begin
  arrayOfIntegers := TArray<Integer>.Create(3,2,8,10,1,6,2,13,13,3,13,13,13,3,45);
end;

【讨论】:

  • 请注意,这将是一个基于 0 的数组,而不是最初的基于 1 的数组。
  • 是的,会的。这就是为什么在循环数组时最好使用 Low() 和 High() 来避免这个问题。
  • @Linas 你可以使用for i := low(arrayOfIntegers) to high(arrayOfIntegers) do - 我不确定它是否会编译。我想你应该更好,在现代版本的 Delphi 上使用 for aInteger in arrayOfIntegers do
  • @Linas arrayOfInteger 使用后不应该被释放吗?如果是,您可以考虑更改代码以免误导他人。
  • @DavidHeffernan @Linas 感谢您的意见。我通常不使用这种语法(因为我希望我的代码在大多数 Delphi 版本中编译,包括 FPC)。这就是为什么我的 cmets 是问题的形式,而不是断言的形式。让我担心的是动态数组或TArray&lt;Integer&gt; 是从0 开始的,与Array[1..15] of Integer 不同。普通的静态数组仍然存在并且有它们的意义!在所有情况下,我都很高兴能学到一些东西,谢谢大家。
【解决方案2】:

典型的用法如下:

type
  TIntegerArray1to15 = Array[1..15] of Integer;
const
  INIT_INT_1_15_ARRAY: TIntegerArray1to15 = (3,2,8,10,1,6,2,13,13,3,13,13,13,3,45);

var
  arrayOfIntegers : TIntegerArray1to15;
begin
  arrayOfIntegers := INIT_INT_1_15_ARRAY;
  .... use and update arrayOfIntegers[]
end;

在这种情况下,您最好定义自己的类型(代码不会变慢或变大,并且您将能够在这种类型的实例之间进行分配)。并且您将确保您的数组边界符合预期 (1..15)。

const 语句将被编译为“引用”数组,该数组将复制到您的 arrayOfIntegers 局部变量中。我把它改成了大写,这在声明常量时有点常见(但不是强制性的——这只是个人喜好)。

如果您希望您的代码更加通用和可重用(恕我直言,如果您想成为一个懒惰的程序员,这很有意义)您可以依赖 动态数组 和/或array of const 参数(如果您的数组以索引 0 开头)。

【讨论】:

    【解决方案3】:

    const 部分中使用的语法仅对类型化数组常量有效。您不能将其用作赋值中的文字数组常量。

    【讨论】:

      【解决方案4】:

      这是一个为整个整数数组赋值的示例

      const
        C_ARR_COST : array ['a'..'e'] of string = ('01','02','03');
      var Conter:Char;
      begin
        //Loop
        for Conter := Low(C_ARR_COST) to high(C_ARR_COST) do
          ShowMessage(C_ARR_COST[Conter]);
      
        //Direct
        ShowMessage(C_ARR_COST['a']);
      end;
      

      祝你好运。

      【讨论】:

        猜你喜欢
        • 2012-10-10
        • 1970-01-01
        • 2023-01-27
        • 2010-10-02
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多