如何在fortran中初始化整数种类8的数组?

时间:2017-01-03 11:44:28

标签: arrays fortran fortran90 fortran77 fortran95

我想在fortran中初始化一个大整数数组,我试过了:

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

但整数仍为默认类= 4。我后来在数组中添加了数字:

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

我收到“此数字常量超出范围”错误。因为它不适合在kind = 4 int中,但会在一种= 8 int。

我也尝试将其声明为:

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

但这也行不通。

编辑: 感谢Vladimir 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/)

还是不一样?感谢

2 个答案:

答案 0 :(得分:6)

首先,kind=8可以是任何东西,它不必是64位。最好从int64使用iso_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

Fortran 2003还允许定义数组构造函数的类型

 [ integer(int64) :: ]

但这在这里没有帮助,表达式中的每个单独的常量必须是合法的。

答案 1 :(得分:0)

除了为数组中的每个值指定KIND(如@Vladimir所示)之外,您还可以使用编译器选项,以便默认情况下任何带有未指定KIND的整数都是8字节长。

例如,在Windows上使用英特尔Fortran时,它是:/integer-size:64或Linux:-integer-size 64

我没试过,但gfortran似乎有类似的选项:-fdefault-integer-8