为什么一个真正永远是另一个真实的价值?

时间:2016-01-22 13:32:28

标签: visual-studio-2010 fortran intel

我在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

tri始终具有相同的价值。

奇怪的是,当我在分配ti=0.0d0后添加ti时,此错误消失了。一切都表现得很好。

我尝试将此函数导出到另一个程序以触发此错误并发布可编译示例,但最小化程序工作正常并且不显示此类行为。

编译器:采用Visual Studio 2010的英特尔®Fortran编译器XE 13.1 子例程和函数被编译为DLL。 Fortran Main打开输入文件,调用DLL并写入结果。

我可以通过Visual Stuido的Debug函数看到这种行为,并将值写入命令提示符。

0 个答案:

没有答案