在Delphi 2007 Pascal初始化块中声明索引变量的语法是什么?
我需要在Delphi初始化块中初始化和数组 您似乎无法在初始化块中使用var块,因为这不会编译:在Delphi 2007 Pascal初始化块中声明索引变量的语法是什么?,delphi,delphi-7,pascal,Delphi,Delphi 7,Pascal,我需要在Delphi初始化块中初始化和数组 您似乎无法在初始化块中使用var块,因为这不会编译: initialization var idx : Integer; begin for idx := 0 to length(LastState)-1 do begin LastState[idx] := $FFFF; end; end; (第一个编译错误涉及var): ([DCC Error]scheautoinfrab2.pas(6898):应为E2029语句,
initialization
var
idx : Integer;
begin
for idx := 0 to length(LastState)-1 do begin
LastState[idx] := $FFFF;
end;
end;
(第一个编译错误涉及var):
([DCC Error]scheautoinfrab2.pas(6898):应为E2029语句,但
(找到“VAR”)
这也不会编译(因为未声明idx):
[DCC错误]scheautoinfrab2.pas(6899):E2003未声明的标识符:“idx”
我知道我可以在主单元声明中声明索引器,但这有两个缺点:
初始化部分调用该过程:
procedure InitLastStateArray;
var
idx : Integer;
begin
for idx := 0 to length(LastState)-1 do begin
LastState[idx] := $FFFF;
end;
end;
initialization
IntLastStateArray;
end.
我知道我可以在主单元声明中声明索引器,但这有两个缺点:
您提到的这两个缺点都可以通过在末尾的实现
部分中声明来避免,就在初始化
部分的正上方。将它放在接口
部分,或者放在实现
部分的顶部,没有必要也没有好处:您提到的缺点是对的,它不必要地增加了变量的范围,并将其声明移离了使用它的位置,而与之抗衡也没有什么好处。如果希望其他单元能够访问这些变量,则只需将变量放入界面
部分
var
idx : Integer;
initialization
for idx := 0 to length(LastState)-1 do
LastState[idx] := $FFFF;
end.
这是您所能得到的最好结果,在D7中无法在初始化
块中获得变量声明,但是为了完整性,在以后的Delphi版本中,您应该能够使用匿名过程,该过程可以在几乎任何地方的表达式中完全定义(包括局部变量)
从技术上讲,这使得idx
成为一个全局变量,但Rob Kennedy指出,只要它只在初始化
块中使用,编译器就会将其视为该块的局部变量。在进行实验时,我发现这并不完全正确,以变量的地址为例,我能够找到反例,但出于实际目的,它应该足够接近。此外,对于只执行一次的块,局部变量和无法访问的全局变量之间没有什么区别。声明一个过程,该过程在初始化部分的正上方初始化数组并从那里调用它。然后在声明LastState的同一位置声明idx。初始化替换begin,变量声明在开始之前。@DavidHeffernan我对宗教争论不感兴趣。我知道全局变量何时会导致维护问题。当他们这样做时,我会避开他们。“当他们不这样做的时候,我不会回避他们。”戴维德费弗南肯定有。如果很明显,代码只调用一次是有意义的,并且它被提取到一个单独的方法中,那么需要更多的努力来验证它只调用一次,并且只从初始化部分调用。是的,这是个小问题。全局变量也是如此,对于这种情况,私有范围变量是完全合适的。确保单元范围变量仅由初始化部分使用的一种方法是在该部分的正上方声明它,在这种情况下,它在视觉上类似于在普通函数的begin
关键字的正上方声明局部变量。(一旦还有一个finalization部分,就很难证明索引变量是真正的“本地”变量,因为它可用于两个单独的块。)@hvd,不,那里没有用于声明的语法。此时有两个范围级别可用,正确的一个是单元的私有范围。
var
idx : Integer;
initialization
for idx := 0 to length(LastState)-1 do
LastState[idx] := $FFFF;
end.