此Delphi代码在编译为32位时有效,但在编译为64位时却产生访问冲突。代码是否有问题,还是有编译器错误?
{$APPTYPE CONSOLE}
uses
SysUtils;
const
MaxSize = 2; // nothing special about this value, could equally be 1
type
TArraySize = 1..MaxSize;
procedure Main;
var
size: TArraySize;
arr: array [-MaxSize..MaxSize] of Integer;
begin
FillChar(arr, SizeOf(arr), 0); // zero initialize
size := MaxSize;
Writeln(arr[-size]);
end;
begin
try
Main;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
答案 0 :(得分:12)
这是一个编译器错误。编译器无法处理
arr[-size]
正确,大概是因为size
是子范围类型。
您可以通过强制编译器在Integer
上下文中执行算术来解决该错误。
arr[-Integer(size)]
您应该向Embarcadero的质量门户网站提交错误报告。
更新
我在XE7中对此进行了测试。根据评论,该缺陷似乎至少在西雅图已得到修复。
答案 1 :(得分:0)
出现访问冲突错误的编译器始终存在错误。编译器决不应这样做,而应妥善处理所有发生的错误。