我有一个看起来像这样的 Fortran 子例程。
subroutine load_ed_ecosystem_params()
use pft_coms , only : include_these_pft & ! intent(in)
, is_tropical & ! intent(out)
, is_liana ! intent(out)
implicit none
!---------------------------------------------------------------------------------------!
! This flag should be used to define whether the plant is tropical/subtropical or !
! not. !
!---------------------------------------------------------------------------------------!
is_tropical(1:4) = .true.
is_tropical(5:11) = .false.
is_tropical(12:13) = .false.
is_tropical(14:15) = .true.
is_tropical(16) = .true.
is_tropical(17) = .true.
!---------------------------------------------------------------------------------------!
!---------------------------------------------------------------------------------------!
! This flag should be used to define whether the plant is a liana or not !
!---------------------------------------------------------------------------------------!
is_liana(1:16) = .false.
is_liana(17) = .true.
!---------------------------------------------------------------------------------------!
数组 is_tropical
和 is_liana
在 pft_coms.f90
文件中定义。
数组采用奇怪的值,因此我在 gdb 中运行可执行文件。我在作业之前和作业之后破坏了文件。在分配任务之前我得到
Breakpoint 1, load_ed_ecosystem_params () at ed_params.f90:87
87 is_tropical(1:4) = .true.
(gdb) print is_tropical
$2 = (.FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE.)
(gdb) print is_liana
$3 = (.FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE.)
就像他们应该的那样,因为它们是这样初始化的。运行接下来的几行后我得到
(gdb) n
88 is_tropical(5:11) = .false.
(gdb) n
89 is_tropical(12:13) = .false.
(gdb) n
90 is_tropical(14:15) = .true.
(gdb) n
91 is_tropical(16) = .true.
(gdb) n
96 is_tropical(17) = .true.
(gdb) n
102 is_liana(1:16) = .false.
(gdb) n
103 is_liana(17) = .true.
(gdb) print is_tropical
$4 = (4294967295, 4294967295, 4294967295, 4294967295, .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., 4294967295, 4294967295, 4294967295, 4294967295)
(gdb) print is_liana
$6 = (.FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., 4294967295)
为什么向量被分配整数 2^32 - 1 而不是逻辑 .true.
?
最佳答案
一些 Fortran 编译器(尤其是 Intel Fortran)使用位模式 -1 来表示 .TRUE.,有些则使用 +1。
看起来 GDB 期望 +1 为 .TRUE。并且不知道 4294967295 也是.TRUE.,只是在不同的编译器中。
无符号整数 4294967295 与有符号整数 -1 具有相同的位模式。所有位均设置为 1。
您可以通过-standard-semantics
或-fpscomp逻辑
更改此行为。然后,英特尔 Fortran 将使用 +1 作为 .TRUE..
关于segmentation-fault - Fortran 奇怪的赋值,是 4294967295 == .true.?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40594448/