如何在 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
我想用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