Delphi代码在64位访问冲突时失败

时间:2018-09-21 12:58:05

标签: delphi

此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.

2 个答案:

答案 0 :(得分:12)

这是一个编译器错误。编译器无法处理

arr[-size]

正确,大概是因为size是子范围类型。

您可以通过强制编译器在Integer上下文中执行算术来解决该错误。

arr[-Integer(size)]

您应该向Embarcadero的质量门户网站提交错误报告。

更新

我在XE7中对此进行了测试。根据评论,该缺陷似乎至少在西雅图已得到修复。

答案 1 :(得分:0)

出现访问冲突错误的编译器始终存在错误。编译器决不应这样做,而应妥善处理所有发生的错误。