segmentation-fault - Fortran 奇怪的赋值,是 4294967295 == .true.?

标签 segmentation-fault fortran gdb variable-assignment

我有一个看起来像这样的 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_tropicalis_lianapft_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/

相关文章:

python - 使用 Python 帮助抛出 SEGFAULT

windows - excel/fortran dll 连接中的文件位置问题

c++ - 段错误,找不到我做错的地方

c# - 托管语言如何确保没有段错误

fortran - 在 FORTRAN 中读取输入文件

fortran - 在 Fortran 90 中打开多个文件

gdb - gdb 7.10 中的 Python 异常错误

c++ - gdb 关于符号的问题

c - 为什么我不能在 gdb 中打印出环境变量?

c - 来自 C 中输入文件的 fgets 的段错误