我正在编写一些代码,其中需要使用我的指南提供的一些模块。现在,在这些模块中,有一些子程序采用虚拟数组,它们具有固定的维数。但是,我需要将一些可分配的数组传递给这些函数。
我想知道的是,是否有一种方法可以将可分配数组作为参数传递给其伪参数具有固定维数的子例程或函数。
这是要使用的实际子例程:
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
标志
但是我的问题并不特别依赖于此程序。对此的任何解释以及任何阅读资源都将非常有帮助,因为我找不到合适的资源来回答这个确切的问题。