2017-01-03 3 views
1
내가 포트란 큰 정수의 배열을 초기화 할

는, 나는 시도했다 :포트란에서 정수 종류 8의 배열을 초기화하는 방법은 무엇입니까?

integer(kind=8) :: XGrid(1:20) 

그러나 정수는 기본 종류 = 4 남아있다. 나중에 배열에 숫자를 추가하면 다음과 같습니다.

XGrid = (/3002, 3340403,....,19460630000/) 

그리고 "이 숫자 상수가 범위를 벗어났습니다."라는 오류 메시지가 나타납니다. 그것은 kind = 4 int에 적합하지는 않지만 kind = 8 int에 있습니다.

나는 또한로 선언 시도 :

integer, parameter :: ik8 = selected_int_kind(8) 
integer(ik8) :: XGrid(1:20) 

하지만이 또한 작동하지 않았다.

편집 : 감사 블라디미르 F,하지만 난 그냥 하나의 변수가 아닌 배열을 정의하려고하고 같은 난에 사용되는 대답에 적응하는 방법을 이해하지 못할 : Is There a Better Double-Precision Assignment in Fortran 90? 그것은 다음과 같습니다

integer, parameter :: ik8 = selected_int_kind(8) 
integer(ik8) :: XGrid(1:20)_ik8 
XGrid = (/3002_ik8, 3340403_ik8,....,19460630000_ik8/) 

또는 다른가요? 감사합니다.

답변

6

먼저 kind=8은 64 비트 일 필요는 없습니다. 대신 int64iso_fortran_env에서 사용하는 것이 좋습니다. 당신은 예를

integer, parameter :: ìp = int64 

이름을 따서 자신의 이름 상수를 만들 수있다하지만 더 중요한 것은,

(/3002, 3340403,....,19460630000/)

는 사용 가능한 정보는 종류 8. 이전인지 확인하기 위해이없는 기본 정수 배열 식입니다 = 할당은 부적합합니다. 표현식은 그 문맥을 신경 쓰지 않는다. SE는 또한 Is There a Better Double-Precision Assignment in Fortran 90?

당신은

(/3002_8, 3340403_8,....,19460630000_8/)

이상이

(/3002_int64, 3340403_int64,....,19460630000_int64/)

(또는 _ip)

포트란 2003

는 또한의 유형을 정의 할 수 있습니다 종류를 표시해야 배열 생성자

[ integer(int64) :: ] 

하지만 여기서는 도움이되지 않습니다. 표현의 각 개별 상수는 합법적이어야합니다.

+0

덕분에 큰 도움을 –

+0

@Vladimir 이잖아 : 무슨'(/3002.d0, 3340403.d0에 대해 ,. ..., 19460630000.d0 /)'? 이것은 동등한/휴대용입니까? – Coriolis

+0

@Ian : 죄송합니다. 배열이 진짜인지 말입니다. 'integer, parameter :: real64 = SELECTED_REAL_KIND (15,307)'를 정밀도 종류로 사용하면 '3002.d0'과'3002_real64'를 쓰는 것과 동일합니까? – Coriolis

0

배열의 각 값에 대해 KIND를 지정하는 것 외에 @Vladimir과 같이 컴파일러 옵션을 사용할 수 있으므로 기본적으로 KIND가 지정되지 않은 정수는 8 바이트 길이가됩니다.

예를 들어, Windows의 Intel Fortran은 /integer-size:64 또는 Linux는 -integer-size 64입니다.

나는 그것을 시도했지만 gfortran에서 비슷한 옵션이 될 것 같다되지 않은 : -fdefault-integer-8