2017-01-03 63 views
1

我想初始化FORTRAN大整數數組,我曾嘗試:如何在fortran中初始化整數類型8的數組?

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

但整數保持默認KIND = 4。正如我稍後將數字添加到陣列:

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

而且我收到「此數字常量超出範圍」錯誤。因爲它不適合一種= 4 int,但會在一種= 8 int。

我自己也嘗試聲明爲:

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

但是,這也沒有工作。

編輯: 感謝弗拉基米爾女,但我試圖定義一個數組,而不僅僅是一個單一的變量,因此我無法理解如何適應中使用的答案: 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位。改爲使用iso_fortran_env替代int64更好。您可以命名爲例如

integer, parameter :: ìp = int64 

自己命名不變,但更重要的是,

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

是默認的整數數組表達式沒有可用的信息,使其樣8.什麼是前=分配是無關緊要的。表達式並不關心其上下文。硒還Is There a Better Double-Precision Assignment in Fortran 90?

您必須註明那種

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

或更好

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

(或_ip

的Fortran 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