【问题标题】:What is the syntax for declaring an index variable in a Delphi 2007 Pascal Initialization block?在 Delphi 2007 Pascal Initialization 块中声明索引变量的语法是什么?
【发布时间】:2016-02-22 19:38:21
【问题描述】:

我需要在 Delphi 初始化块中进行初始化和数组。

您似乎不能在初始化块中使用 var 块,因为这不会编译:

initialization
var
idx : Integer;
begin
    for idx := 0 to length(LastState)-1 do begin
        LastState[idx] := $FFFF;
    end;
end;

(第一个编译错误抱怨var):

([DCC 错误] ScheAutoInfRb2.pas(6898): E2029 语句预期但 找到“VAR”)

这也不编译(因为没有声明 idx):

initialization

    for idx := 0 to length(Last_Pro2State)-1 do begin
        Last_Pro2State[idx] := $FFFF;
    end;

[DCC 错误] ScheAutoInfRb2.pas(6899): E2003 未声明的标识符:'idx'

我知道我可以在主单元声明中声明一个索引器,但这有几个缺点:

  1. 索引器的声明与其使用分开,但 实现部分(可能在数百行之外),以及

  2. 索引器的范围包括所有功能和过程 在实施部分。

【问题讨论】:

  • 声明一个过程,在初始化部分的正上方初始化数组并从那里调用它。
  • 并在你声明 LastState 的地方声明 idx。
  • 初始化替换begin,变量声明在begin之前。

标签: delphi delphi-7 pascal


【解决方案1】:

你不能。

执行此操作的通常方法是编写一个过程,然后从initialization 部分调用:

procedure InitLastStateArray;
var
  idx : Integer;
begin
  for idx := 0 to length(LastState)-1 do begin
    LastState[idx] := $FFFF;
  end;
end;

initialization
  IntLastStateArray;

end.

【讨论】:

    【解决方案2】:

    我知道我可以在主单元声明中声明一个索引器,但这有几个缺点:

    您提到的两个缺点都可以通过在末尾的implementation 部分声明它来避免,就在initialization 部分的上方。将它放在您的 interface 部分中没有必要或好处,也没有将它放在 implementation 部分的顶部:您提到的缺点是正确的,它不必要地增加了变量的范围并移动了它声明远离使用它的地方,并且没有任何优势可以对抗它。如果您希望其他单位能够访问这些变量,您只需将变量放在 interface 部分。

    var
      idx : Integer;
    initialization
      for idx := 0 to length(LastState)-1 do
        LastState[idx] := $FFFF;
    end.
    

    这是你能得到的最好的,在 D7 中没有办法在 initialization 块中获取变量声明,但为了完整起见,在 Delphi 的更高版本中,你应该能够使用匿名过程,可以定义完全(包括局部变量)在几乎任何地方的表达式中。


    虽然从技术上讲,这使得idx 成为全局变量,但 Rob Kennedy 指出,只要它仅在 initialization 块内使用,编译器就会将其视为该块的本地变量。在实验时,我发现这并不完全正确,例如在获取变量的地址时,我能够找到反例,但出于实际目的,它应该足够接近。此外,对于只执行一次的块,局部变量和全局变量之间几乎没有区别。

    【讨论】:

    • @DavidHeffernan 我对宗教争论不感兴趣。我知道全局变量何时会导致维护问题。当他们这样做时,我会避开他们。当他们不这样做时,我不会避开他们。
    • @DavidHeffernan 当然有。如果很明显代码只调用一次才有意义,并且它被提取到一个单独的方法中,那么需要更多的努力来验证它只被调用一次并且只从初始化部分调用。是的,这是一个小问题。全局变量也是如此。
    • 私有范围变量非常适合这种情况。
    • Unit-scope variables that are used only in the initialization section are treated by the compiler like local variables. 确保单元范围变量仅由初始化部分使用的一种方法是在该部分的正上方声明它,在这种情况下,它在视觉上类似于在正上方声明一个局部变量普通函数的begin 关键字。 (一旦还有一个终结部分,那么就很难说索引变量真的是“本地的”,因为它可用于两个单独的块。)
    • @hvd,不,那里没有声明的语法。此时有两个范围级别可用,正确的一个是单元的私有范围。
    猜你喜欢
    • 1970-01-01
    • 2015-11-29
    • 2014-02-24
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 2015-01-07
    相关资源
    最近更新 更多