Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 为什么一个实数总是另一个实数的值?_Visual Studio 2010_Fortran_Intel - Fatal编程技术网

Visual studio 2010 为什么一个实数总是另一个实数的值?

Visual studio 2010 为什么一个实数总是另一个实数的值?,visual-studio-2010,fortran,intel,Visual Studio 2010,Fortran,Intel,我在Fortran程序中观察到两个值的一些奇怪行为 函数Abstrand_flex从不同的子例程调用多次,其中两个接口值(仅用于输出)始终具有相同的值。如果一个的值改变,另一个的值也会改变 以下是摘录: Subroutine foo (...) !DEC$ ATTRIBUTES DLLEXPORT, DECORATE, ALIAS :: walzspalt implicit none ... real(8), allocatable, dimension(:) :: x_dis,y_dis,z_

我在Fortran程序中观察到两个值的一些奇怪行为

函数Abstrand_flex从不同的子例程调用多次,其中两个接口值(仅用于输出)始终具有相同的值。如果一个的值改变,另一个的值也会改变

以下是摘录:

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
之后添加
ti=0.0d0
时,这个错误消失了。一切都很好

我试图将此函数导出到另一个程序以触发此错误并发布一个可编译的示例,但最小化的程序工作正常,没有显示这种行为

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


我可以通过Visual Stuido的调试功能以及将值写入命令提示符来看到这种行为。

我认为您应该显示更多代码。至少完整的标题。程序是否在模块中?无模块。我将根据您的描述添加更多代码,问题出在其他地方。首先要做的最好的事情是添加一些编译选项,这些选项将触发内存问题,例如检查数组边界,并最终在调试器中运行。在输入Abstrand_flex()之前,R(=R)是否初始化?您必须准备一个MCVE。仍然重现问题的最小代码。创建副本并无情地删除,但始终检查问题是否仍然存在。如果它消失了,您很有可能删除的内容与错误有关。