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

How to initialize array of integer kind 8 in fortran?

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

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

但是整数仍然是默认的 kind=4。当我稍后将数字添加到数组中时:

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

然后我收到 "This numeric constant is out of range" 错误。因为它不适合 kind=4 int,但会适合 kind=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/)

还是不一样?谢谢

首先,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) :: ]

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

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

例如,对于 Windows 上的 Intel Fortran,它是:/integer-size:64,或 Linux:-integer-size 64

没试过,gfortran里好像有类似的选项:-fdefault-integer-8