在 Delphi 2007 Pascal 初始化块中声明索引变量的语法是什么?
What is the syntax for declaring an index variable in a Delphi 2007 Pascal Initialization block?
我需要在 Delphi 初始化块中初始化和排列。
您似乎不能在初始化块中使用 var 块,因为这不会编译:
initialization
var
idx : Integer;
begin
for idx := 0 to length(LastState)-1 do begin
LastState[idx] := $FFFF;
end;
end;
(第一个编译错误抱怨var):
([DCC Error] ScheAutoInfRb2.pas(6898): E2029 Statement expected but
'VAR' found)
这也不编译(因为没有声明 idx):
initialization
for idx := 0 to length(Last_Pro2State)-1 do begin
Last_Pro2State[idx] := $FFFF;
end;
[DCC Error] ScheAutoInfRb2.pas(6899): E2003 Undeclared identifier: 'idx'
我知道我可以在主单元声明中声明一个索引器,但这有几个缺点:
索引器的声明和使用是分开的,但是
实现部分(可能有数百行),以及
索引器的范围包括所有的函数和过程
在实施部分。
你不能。
执行此操作的通常方法是编写一个过程,然后从 initialization
部分调用该过程:
procedure InitLastStateArray;
var
idx : Integer;
begin
for idx := 0 to length(LastState)-1 do begin
LastState[idx] := $FFFF;
end;
end;
initialization
IntLastStateArray;
end.
I know that I can declare an indexer in the main unit declaration, but that has a couple of disavantages:
你提到的两个缺点都可以通过在最后的 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
块内使用,编译器就会将其视为局部变量那个街区。在实验时,我发现这并不完全正确,我能够以变量的地址为例找到反例,但出于实际目的,它应该足够接近了。此外,对于只执行一次的块,局部变量和全局变量之间几乎没有区别,否则无法访问。
我需要在 Delphi 初始化块中初始化和排列。
您似乎不能在初始化块中使用 var 块,因为这不会编译:
initialization
var
idx : Integer;
begin
for idx := 0 to length(LastState)-1 do begin
LastState[idx] := $FFFF;
end;
end;
(第一个编译错误抱怨var):
([DCC Error] ScheAutoInfRb2.pas(6898): E2029 Statement expected but 'VAR' found)
这也不编译(因为没有声明 idx):
initialization
for idx := 0 to length(Last_Pro2State)-1 do begin
Last_Pro2State[idx] := $FFFF;
end;
[DCC Error] ScheAutoInfRb2.pas(6899): E2003 Undeclared identifier: 'idx'
我知道我可以在主单元声明中声明一个索引器,但这有几个缺点:
索引器的声明和使用是分开的,但是 实现部分(可能有数百行),以及
索引器的范围包括所有的函数和过程 在实施部分。
你不能。
执行此操作的通常方法是编写一个过程,然后从 initialization
部分调用该过程:
procedure InitLastStateArray;
var
idx : Integer;
begin
for idx := 0 to length(LastState)-1 do begin
LastState[idx] := $FFFF;
end;
end;
initialization
IntLastStateArray;
end.
I know that I can declare an indexer in the main unit declaration, but that has a couple of disavantages:
你提到的两个缺点都可以通过在最后的 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
块内使用,编译器就会将其视为局部变量那个街区。在实验时,我发现这并不完全正确,我能够以变量的地址为例找到反例,但出于实际目的,它应该足够接近了。此外,对于只执行一次的块,局部变量和全局变量之间几乎没有区别,否则无法访问。