这个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.
Run Code Online (Sandbox Code Playgroud)
Dav*_*nan 12
这是编译器错误.编译器无法处理
arr[-size]
Run Code Online (Sandbox Code Playgroud)
正确的,大概是因为size是一个子范围类型.
您可以通过强制编译器在Integer上下文中执行算法来解决该错误.
arr[-Integer(size)]
Run Code Online (Sandbox Code Playgroud)
您应该向Embarcadero的质量门户提交错误报告.
更新
我在XE7中测试了这个.根据评论,该缺陷似乎至少在西雅图得到修复.