使用固定尺寸的伪变量将可分配数组传递给子例程

时间:2018-09-10 21:19:11

标签: fortran gfortran

我正在编写一些代码,其中需要使用我的指南提供的一些模块。现在,在这些模块中,有一些子程序采用虚拟数组,它们具有固定的维数。但是,我需要将一些可分配的数组传递给这些函数。

我想知道的是,是否有一种方法可以将可分配数组作为参数传递给其伪参数具有固定维数的子例程或函数。

这是要使用的实际子例程:

function crosscorr(x, y, n, k)
! Cross-correlation of array x and y for a given time shift k.
implicit none
integer :: n, k
real(8), dimension(0:n-1) :: x, y
real(8) crosscorr
if (k.ge.0) then
    crosscorr = dot_product(x(0:n-1-k), y(k:n-1))
else
    crosscorr = dot_product(x(-k:n-1), y(0:n-1+k))
endif
end function crosscorr
!!!---------------------------------------------------------------------!!!


!!!---------------------------------------------------------------------!!!
subroutine xcorr_full(x, y, n, shift, delay, ccmax, ccpol)
! Cross-correlation of array x and y.
! Return time shift, correlation coefficient, and polarity at maximum correlation.
implicit none
integer :: n, shift, delay, ccpol
real(8), dimension(0:n-1) :: x, y
real(8) :: cc, ccmax, ccmin
integer :: k, kmin
!f2py intent(in)  :: x, y, n, shift
!f2py intent(out) :: delay, ccmax, ccpol
!f2py intent(hide):: c, k, kmin, ccmin

shift = 1
ccmax = 0
ccmin = 0
kmin = 0
do k = -n+1,n-1,shift
    cc = crosscorr(x,y,n,k)   
    if (cc.gt.ccmax) then
        ccmax = cc
        delay = k
    endif
    if (cc.lt.ccmin) then
        ccmin = cc
        kmin = k
    endif
enddo
if (ccmax.gt.-ccmin) then
    ccpol = 1
else
    ccmax = -ccmin
    delay = kmin
    ccpol = -1
endif
ccmax = ccmax/sqrt( dot_product(x,x) * dot_product(y,y) )

end subroutine xcorr_full

这是程序中的代码:

real(8), allocatable :: v(:,:),vref_win(:),v_win(:)

allocate(vref_win(0:ending-starting))
allocate(v_win(0:ending-starting))
vref_win(0:ending-starting)=v(starting-1:ending-1,ref_t)


do i=0,n_stn-1
    v_win(0:ending-starting)=v(starting-1:ending-1,i)
    call xcorr_full(vref_win,v_win,ending-starting+1,1,t_corr,r,sign)
enddo

整个程序有点长,所以我不在这里发布它,但是所有变量都已正确定义,数组v有数据,并且索引正确

如果我只是尝试正常传递数组,这就是我得到的错误:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

在使用gfortran(v7.3.0)进行编译时,我正在使用-fcheck=all标志

但是我的问题并不特别依赖于此程序。对此的任何解释以及任何阅读资源都将非常有帮助,因为我找不到合适的资源来回答这个确切的问题。

0 个答案:

没有答案