我在Fortran程序中观察到了两个值的奇怪行为。
从不同的子例程中多次调用函数abstand_flex
,其中两个接口值(仅为intent)始终具有相同的值。如果一个值的值也改变了其他值的值。
以下是摘录:
Subroutine foo (...)
!DEC$ ATTRIBUTES DLLEXPORT, DECORATE, ALIAS :: walzspalt
implicit none
...
real(8), allocatable, dimension(:) :: x_dis,y_dis,z_dis,erg,ti,ri,r_profiel
integer :: npunkte,n_pkt
real(8), allocatable, dimension(:) :: ti,ri
real(8), dimension(3) :: P,R,HP,pkt,RP
real(8) :: t,dist_lager,Abstand_flex
real(8), parameter :: pi=Dacos(-1.d0)
real(8), allocatable, dimension(:,:) :: wrandi
real(8), dimension(n_pkt) :: r_arr,x_arr
...
allocate(x_dis(2*npunkte+1),y_dis(2*npunkte+1),z_dis(2*npunkte+1))
allocate(erg(2*npunkte+1),ti(2*npunkte+1),wrandi(3,2*npunkte+1),ri(2*npunkte+1))
call test_points(p_dis,r_dis,x_dis,y_dis,z_dis,npunkte,P,x_min+(l_ges*0.05d0),l_ges-2*(l_ges*0.05d0))
do i=1, 2*npunkte+1
pkt(1)=x_dis(i)
pkt(2)=y_dis(i)
pkt(3)=z_dis(i)
erg(i)=Abstand_flex(pkt,P,R,r_arr,x_arr,n_pkt,ti(i),wrandi(1:3,i),ri(i))
end do
...
end subroutine foo
功能:
real(8) function Abstand_flex(pkt,P,R,r_arr,x_arr,npunkte,t,w_rand,ri)
integer npunkte
real(8), intent(in), dimension(npunkte) :: r_arr,x_arr
real(8), dimension(3), intent(in) :: P,R,pkt
real(8) :: k,ri2,t_save
real(8), dimension(3) :: erg_kreuz
real(8), dimension(3) :: p_1,r_1,p_tmp
real(8), dimension(3), intent (out) :: w_rand
real(8), dimension(3) :: p_2,r_2, p_d_1,p_d_2,r_d_1,erg_kreuz2 !
real(8) :: t2,dist_neu
real(8), intent(out) :: ri,t
real(8), parameter :: pi=Dacos(-1.0d0)
integer :: i,l
...
t=-(r(1)*p_tmp(1)+r(2)*p_tmp(2)+r(3)*p_tmp(3)) / (r(1)*r(1)+r(2)*r(2)+r(3)*r(3))
...
ri=(t-x_arr(i))/(x_arr(i+1)-x_arr(i))*(r_arr(i+1)-r_arr(i))+r_arr(i)
...
end function Abstand_flex
t
和ri
始终具有相同的价值。
奇怪的是,当我在分配ti=0.0d0
后添加ti
时,此错误消失了。一切都表现得很好。
我尝试将此函数导出到另一个程序以触发此错误并发布可编译示例,但最小化程序工作正常并且不显示此类行为。
编译器:采用Visual Studio 2010的英特尔®Fortran编译器XE 13.1 子例程和函数被编译为DLL。 Fortran Main打开输入文件,调用DLL并写入结果。
我可以通过Visual Stuido的Debug函数看到这种行为,并将值写入命令提示符。