1

进入子程序时出现分段错误。在调试器中,我可以一直执行call RK_sub_step到以下代码段中的第一个。一旦我进入子程序,它就会出现段错误。

module RK_mod

type(MyType), dimension(1:2) :: q0, q1, q2

contains

subroutine RK_sub_step(src, alpha, dest)
   real(8), dimension(:) :: alpha
   type(MyType), dimension(1:2,size(alpha)) :: src
   type(MyType), dimension(1:2), intent(inout) :: dest

   ! compute dest from alpha and src
end subroutine

subroutine RK()
    real(8) alpha(3)
    call RK_sub_step((/q0/), (/alpha(1)/), q1)    ! <- Segfault here
    call RK_sub_step((/q0, q1/), alpha(2:3), q2)
end subroutine

end module

有什么想法我可能做错了吗?

编辑:

现在我设法通过创建可以调用的单独子例程来规避段错误

call RK_sub_step1(q0, alpha(1), q1)
call RK_sub_step2(q0, q1, alpha(2:3), q2)
call RK_sub_step4(q0, q1, q2, q3, alpha(4:8), q0)

但我仍然想知道,是否有可能只有一个像上面那样的子程序,或者为什么这不可能。

4

2 回答 2

1

我认为问题在于

(/q0/)

构造一个 rank-1 数组myType,在导致分段错误的行中,将其传递给一个子例程,该子例程期望 rank-2 数组myType作为其第一个参数。

(/qo/)q0如果是 rank-1 数组,则不会构造 rank-2 数组。

于 2013-07-15T06:03:03.783 回答
0

您可能可以做两件事来满足您对单个子例程的需求:

  • 定义type(mytype), dimension(:,:), allocatable :: qtemp然后将其分配到正确的大小(例如2,2),然后使用循环设置它

    do i=1,2
       qtemp(i,:) = (/q0(i), q1(i)/)
    enddo
    
  • 为不同数量的输入变量编写不同的子例程,然后使用一个interface块——有关这些的帮助,请参见此处此处

于 2013-07-15T12:07:32.923 回答