2017-01-03 81 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