我想在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/)
还是不一样?感谢
答案 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