我有一个从外部模块调用子程序的 Fortran 数字代码。在我尝试在另一台机器上编译和运行之前,这段代码一直运行良好。在新机器上,我的程序很快就崩溃了。
使用调试打印语句,我已经隔离了崩溃发生在从外部子例程返回时。主程序多次调用子程序,第二次调用子程序返回时发生崩溃(第一次调用正常)。它总是在使用这组输入数据的第二个子程序调用时崩溃,但是对于另一组输入数据(大约是第一个数据的 1/3),它在从第五个子程序调用返回时崩溃。
这些症状向我表明,每次都将某些内容存储在内存中,并在每个子例程调用中累积,直到空间不足,但我不确定那是什么或如何发生。代码很难简化为最小的工作示例,但我在下面发布了相关部分。让我知道是否还有其他有助于查看的内容。它基本上是固定形式的 Fortran 90。
use fd
implicit none
integer, parameter :: ms = 2000
integer n
real(dp), dimension(ms) :: s
real(dp), dimension(ms) :: e
real(dp), dimension(ms) :: f
real(dp), dimension(ms) :: d1f
real(dp), dimension(ms) :: d2f
real(dp), dimension(ms) :: c, d
real(dp), dimension(ms) :: a
real(dp), dimension(ms) :: b
real(dp), dimension(ms) :: temp
integer w
integer k
real(dp) th
do i = 1,n
temp(i) = a(i)
end do
call lprsmf(s(1:n),temp(1:n),n,w,k,th,a(1:n),d1f(1:n),
* d2f(1:n))
do i = 1,n
temp(i) = b(i)
end do
call lprsmf(s(1:n),temp(1:n),n,w,k,th,b(1:n),d1f(1:n),
* d2f(1:n))
do i = 1,n
temp(i) = c(i)
end do
call lprsmf(s(1:n),temp(1:n),n,w,k,th,c(1:n),d1f(1:n),
* d2f(1:n))
do i = 1,n
temp(i) = d(i)
end do
call lprsmf(s(1:n),temp(1:n),n,w,k,th,d(1:n),d1f(1:n),
* d2f(1:n))
do i = 1,n
temp(i) = e(i)
end do
call lprsmf(s(1:n),temp(1:n),n,w,k,th,e(1:n),d1f(1:n),
* d2f(1:n))
do i = 1,n
temp(i) = f(i)
end do
call lprsmf(s(1:n),temp(1:n),n,w,k,th,f(1:n),d1f(1:n),
* d2f(1:n))
模块fd
:
module fd
! Double precision real kind
integer, parameter :: dp = selected_real_kind(15)
contains
subroutine lprsmf(x,y,n,w,k,th,s,d1,d2)
! INPUTS:
! x, y, n, w, k, th
! OUTPUTS:
! s, d1, d2
implicit none
real(dp), dimension(n) :: x,y,s,d1,d2
integer n,w,k
real(dp) th
! ... code here ...
end subroutine lprsmf
end module fd
我的编译器是 gfortran 4.6.1。除了让代码停止崩溃之外,我真的很想了解参数传递的基本情况(因为我认为问题在于数组切片被传递出程序)。请注意,a,b,c,d,e,f,s,temp,d1f,d2f
长度为 2000,而n
表示有效数据的范围,其范围为 100-500,具体取决于输入数据的长度。
编辑: 错误消息是 Windows 弹出一个对话框,通知我程序已停止工作。