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

Lau*_*_jj 1 arrays fortran fortran77 fortran90 fortran95

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

integer(kind=8) :: XGrid(1:20)
Run Code Online (Sandbox Code Playgroud)

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

XGrid = (/3002, 3340403,....,19460630000/)
Run Code Online (Sandbox Code Playgroud)

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

我也尝试将其声明为:

integer, parameter :: ik8 = selected_int_kind(8) 
integer(ik8) :: XGrid(1:20)
Run Code Online (Sandbox Code Playgroud)

但这也行不通.

编辑:感谢Vladimir F,但我试图定义一个数组而不仅仅是一个变量,因此我无法理解如何调整使用的答案: Fortran 90中有更好的双精度赋值吗? 可不可能是:

integer, parameter :: ik8 = selected_int_kind(8) 
integer(ik8) :: XGrid(1:20)_ik8
XGrid = (/3002_ik8, 3340403_ik8,....,19460630000_ik8/)
Run Code Online (Sandbox Code Playgroud)

还是不一样?谢谢

Vla*_*r F 6

首先,kind=8可以是任何东西,它不必是64位.相反,使用int64起来要好得多iso_fortran_env.例如,您可以创建自己的命名常量

integer, parameter :: ìp = int64
Run Code Online (Sandbox Code Playgroud)

但更重要的是,

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

是一个默认的整数数组表达式,没有可用的信息使它变得类型8.在=赋值之前是什么无关紧要.表达式不关心它的上下文.Se还有Fortran 90中更好的双精度分配吗?

你必须说明那种

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

或更好

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

(或_ip)

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

 [ integer(int64) :: ]
Run Code Online (Sandbox Code Playgroud)

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