2017-11-23 8 views
-1

10 억 회 동안 루프를 실행하고 실행하지 못하게하려면이 작업을 도와주세요. 서수 오류가 발생했습니다.파스칼, 서수 오류

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에서 j : = 1에서 예상되는 서수식이 – 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

이고 Longints (32 비트)는 100 억까지 올라갈 수 없습니다. 그들의 한계는 약 20 억입니다. 그래서 그는 둥지를 틀어 줘야 할 것입니다. –

-2

for은 플랫폼에 따라 다릅니다.

관찰 : qword는 32 비트 플랫폼에서 카운터 변수로 사용할 수 없습니다.

카운터 변수로 사용할 수있는 데이터 형식 집합을 알려주는 데 필요한 다큐멘터리 지원은 없습니다.


는 32 비트 및 64 비트 플랫폼에서 시도 :

32 비트 : 변수 j
선언이 성공적으로 컴파일 얻기 위해 데이터 형식 dword로 변경 될 수 있습니다.
또한 오버플로로 인한 오류를 방지하려면 release 모드로 컴파일해야합니다.

컴파일러 : Win32에서 무료 파스칼 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에
무료 파스칼 컴파일러 버전 3.0.2 [2017년 3월 18일] 환경 : 맥 OSX는 10.11.6

+0

첫 번째 이미지가 성공적으로 컴파일되지 않았 음을 보여줍니다. –

+0

첫 번째 이미지는 명령 줄에서 왼쪽에 ppcrossx64와 함께 컴파일됨을 보여줍니다. – user8415372

+0

Gotcha. 나는 배경에 관심을 기울이지 않았다. 당신이 발견 한 것이 매우 흥미 롭습니다. –