具有大数组组件的 Fortran 派生数据类型中的分段错误
Segmentation fault in Fortran derived data type with large array component
有人可以解释为什么当 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
我复制了你的错误,但我不得不使用更大的 ND
。真的很行
v1 = data_vec(1.1d0,rv)
可能在堆栈上创建了一个临时对象。
您可以通过分配组件来避免这种情况
v1%f0 = 1.1d0
v1%fvec = rv
有人可以解释为什么当 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
我复制了你的错误,但我不得不使用更大的 ND
。真的很行
v1 = data_vec(1.1d0,rv)
可能在堆栈上创建了一个临时对象。
您可以通过分配组件来避免这种情况
v1%f0 = 1.1d0
v1%fvec = rv