【发布时间】:2016-11-14 17:25:03
【问题描述】:
我有一个像这样的 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.?
【问题讨论】:
-
这看起来就像 GDB 解释值的问题。但我认为这是一个.TRUE。实际上。您是否直接注意到 Fortran 中的任何问题?
-
是的,最终这会导致 SegFault 错误:forrtl: Serious (408): fort: (2): 数组 IS_LIANA 的下标 #1 的值 65 大于17的上限
-
我猜段错误与这个问题无关。顺便说一句,从技术上讲,这不是段错误,而是编译器检查发现错误。您应该阅读该消息并检查您的界限。
-
是的,对不起,我不知道为什么我认为这是一个段错误
标签: segmentation-fault fortran gdb variable-assignment