2013-07-14 2 views
1

У меня возникает ошибка сегментации при вводе подпрограммы. В отладчике я могу сделать шаг до первого call RK_sub_step в следующем сегменте кода. Как только я нахожусь в подпрограмме, это происходит.Segfault при вводе функции Fortran

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 

Любые идеи, что я могу делать неправильно?

Edit:

Теперь мне удалось обойти Segfault путем создания отдельных подпрограмм, которые я могу назвать, как

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) 

Но я до сих пор интересно, если это возможно иметь только один подпрограмму, как дальше выше , или почему это невозможно.

ответ

1

Я думаю, что проблема в том, что это

(/q0/) 

конструирует ранг 1 массив myType, который, в строке, которая вызывает ошибку сегментации, передается в подпрограмму, которая ожидает массив ранга 2 из myType в качестве первого аргумента.

(/qo/) не является, если q0 является массивом ранга-1, постройте массив ранга-2.

0

Вы, вероятно, могли бы сделать две вещи, чтобы соответствовать вашему желания одной подпрограммы:

  • Define type(mytype), dimension(:,:), allocatable :: qtemp, а затем передать его в нужный размер (скажем 2,2), а затем установить его с помощью петли

    do i=1,2 
        qtemp(i,:) = (/q0(i), q1(i)/) 
    enddo 
    
  • Написать различные подпрограммы для различного числа входных переменных, а затем использовать interface блок - see here или here помощь на тех.

Смежные вопросы