2017-11-23 11 views
-1

私は100億回のループを実行する必要があり、実行に失敗しました。私は序数的エラーを得ています。Pascal、Ordinal error

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

"それを実行に失敗" とは何を意味するのでしょうか?あなたのコンピュータは見えません。 –

+0

j:= 1の場合、jで期待される序数式は – krishnamraju

答えて

4

このエラーメッセージのFreePascalドキュメントから。

Error: Ordinal expression expected The expression must be of ordinal type, i.e., maximum a Longint. This happens, for instance, when you specify a second argument to Inc or Dec that doesn’t evaluate to an ordinal value.

変数Kは、qword(64ビット長)として定義されています。 LongIntは32ビットです。

+1

で、倍長整数(32ビット)は100億にはなりません。彼らの限界は約20億です。だから、彼はループを入れなければならないだろう。 –

-2

forステートメントはプラットフォームによって異なります。

観測:qwordは、32ビットプラットフォームでカウンタ変数として使用することはサポートされていません。

カウンタ変数として使用することがサポートされているデータ型を示すドキュメンタリサポートはありません。

は、32ビットと64ビットの両方のプラットフォームで試行:

32ビット:可変j
宣言は、それが正常にコンパイル取得するデータ型dwordに変更することができます。
また、オーバーフローによるエラーを防ぐために、releaseモードでコンパイルする必要があります。

コンパイラ:Win32用のFree PascalのIDE i386用
ターゲットCPU:i386の
バージョン1.0.12 2017年2月13日
コンパイラのバージョン:3.0.2
環境:Win10

編集:
i386フリーパスカルで正常にコンパイルx86_64クロスコンパイラ 64ビット版Win10 (EDIT2:左側のコマンドラインで)
[Image]
推測for文のカウンタは、レジスタを使用して最適化される可能性があります。 i386構成では、qwordは32ビットレジスタでは大きすぎます。

64ビット: [Image]

しかし、64ビットプラットフォームで正常に動作するようです。

コンパイラ:x86_64版
のためのFree Pascalコンパイラのバージョン3.0.2 [2017年3月18日]環境は:マックOSXは10.11.6

+0

最初の画像は、正常にコンパイルできなかったことを示しています。 –

+0

最初の画像は、左側にppcrossx64というコマンドラインでコンパイルされていることを示しています。 – user8415372

+0

Gotcha。私は背景に注意を払っていなかった。あなたが見つけたものはとても面白いです。 –