Pascal,Ordinal错误

时间:2017-11-23 02:31:11

标签: pascal freepascal ordinal

我需要运行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.

2 个答案:

答案 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