【问题标题】:Segmentation fault in Fortran derived data type with large array component具有大数组组件的 Fortran 派生数据类型中的分段错误
【发布时间】:2017-03-02 20:10:04
【问题描述】:

有人能解释一下为什么当 ND 很大(1000000)时下面的代码会产生分段错误吗?增加堆栈限制没有帮助。

module parametros_mod
  integer, parameter :: ND = 1000000
end module parametros_mod

module data_mod
  use parametros_mod
  implicit none
  private

  type, public :: data_vec
    real(8) :: f0
    real(8), dimension(ND) :: fvec
  end type data_vec
end module data_mod

!test program
program test
  use parametros_mod
  use data_mod
  implicit none

  type(data_vec) :: v1
  real(8), dimension(ND) :: rv, xv

  rv = 0d0
  rv(2) = 1d0

  v1 = data_vec(1.1d0,rv)
  xv = v1%fvec
  write(*,'(*(f0.4,2x))') xv(1:3)
end program test

【问题讨论】:

  • 真的,一定有人在大规模教授real(8) 的东西。它不是来自好的教科书或教程。
  • 您的代码在 gfortran 5.3 中不会崩溃。如果它真的对你有用,我会看看data_vec(1.1d0,rv) 表达式,也许它会导致你的编译器产生一个临时对象。告诉我们更多关于您的编译器、编译器标志、操作系统的信息。

标签: segmentation-fault fortran gfortran


【解决方案1】:

我复制了您的错误,但我不得不使用更大的ND。真的是线

v1 = data_vec(1.1d0,rv)

可能在堆栈上创建了一个临时对象。

你可以通过分配组件来避免这种情况

v1%f0 = 1.1d0
v1%fvec = rv

【讨论】:

  • 谢谢弗拉基米尔,它现在正在工作。我正在使用 GNU Fortran (Debian 4.9.2-10) 4.9.2 进行编译。
  • 我在有问题的 SO 中找到了一个替代解决方案:“ulimit -s unlimited”做什么?
  • 您说增加堆栈大小没有帮助。这取决于你,我喜欢我的程序健壮,因为我在许多不同的计算机上运行它们,我不想关心它们每个的堆栈大小。
猜你喜欢
  • 2018-11-15
  • 2014-10-18
  • 2015-05-20
  • 2017-08-12
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 2012-10-24
  • 2017-05-18
相关资源
最近更新 更多