我需要运行100亿次循环并且无法运行它,请帮助我完成这项工作。我收到了序数错误。
program kittu;
var i:qword;
j:qword;
k:qword;
begin
i:= 10000000000;
k:= 0;
for j:=1 to i do
begin
k:=k+1;
end;
writeln(k);
readln();
end.
答案 0 :(得分:4)
从FreePascal文档中获取此错误消息。
错误:预期的序数表达式表达式必须是序数 类型,即最大Longint。例如,当你这样时就会发生这种情况 指定Inc或Dec的第二个参数,该参数不计算为 序数值。
您的变量K定义为qword,长度为64位。 LongInt是32位。
答案 1 :(得分:-2)
for
语句取决于平台。
观察:不支持qword在32位平台上用作计数器变量。
但似乎没有文件支持来告诉我们支持哪些数据类型用作计数器变量。
在32位和64位平台上都尝试过:
32位:
变量j
的声明可以更改为数据类型dword
以使其成功编译
还需要使用release
模式进行编译,以防止因溢出而出现错误。
编译器:适用于i386的Win32的免费Pascal IDE
目标CPU:i386
版本1.0.12 2017/02/13
编译器版本:3.0.2
环境:Win10
修改强>
使用i386 free pascal 与x86_64交叉编译器成功编译
在64位Win10上(编辑2:在左侧的命令行中)
[Image]
猜测:for
语句中的计数器可能会使用寄存器进行优化。在i386配置下,qword对于32位寄存器来说太大了。
64位: [Image]
但它似乎在64位平台上运行良好。
编译器:x86_64的免费Pascal编译器版本3.0.2 [2017/03/18]
环境:Mac OSX 10.11.6