从子程序中取出变量
Getting out variable from a subroutine
我做了一个线性插值代码,但是当我试图在主程序或另一个子程序中得到这个值时,它显示的值是0.0000,但是当我运行子程序中的程序它得到正确的值。
write(,) 'Interpolverdi=',interpolverdi得到正确值
但是当我 运行 写 (,)'main interpolverdi',interpolverdi 我得到 0.0000
的值
我的输入文件运行良好。
我做错了什么?如何从子程序中获取特定值,然后在另一个子程序中使用该值?
感谢您提供的所有帮助:)
!main.f90
program mainn
use inputt
use interpoll
!use mongo
implicit none
integer :: n, itmax,k,bc
real(8) :: epsilon, Re, tmax,dt,h,fux,interpolverdi
real(8), dimension (:), allocatable :: oo,u,v,p
integer, dimension (:), allocatable :: nn
!real(8), dimension(:,:), allocatable :: Uvel, Vvel, pres, psi
call lesinput(n,itmax,k,epsilon,Re,tmax,dt,oo,nn,bc)
call interpol(nn,oo,n)
write(*,*)'main interpolverdi',interpolverdi
end program mainn
!interpoll.f90
module interpoll
implicit none
contains
subroutine interpol(nn,oo,n)
integer :: nn(:), n,s,i
real(8) :: oo(:),interpolverdi
s = size(nn)
do i=1,s-1
if (n==nn(i)) then
interpolverdi= oo(i)
exit
else if ((n>nn(i)) .and. (n<nn(i+1))) then
interpolverdi= oo(i)+((oo(i+1)-oo(i))*(n-nn(i)))/(nn(i+1)-nn(i))
exit
else
interpolverdi=nn(s)
end if
end do
write(*,*) ' Interpolverdi=', interpolverdi
write(*,*)'n=',n
end subroutine interpol
end module interpoll
您有 两个不同的 变量,名为 interpolverdi
。一种在主程序中定义,一种在子程序中定义。
当您在主程序和子例程中执行 write(*,*) interpolverdi
时,它每次都会打印不同的变量。
如果想直接从内部子程序中改变主程序变量,从子程序中删除interpolverdi
的声明。
然而,更好的方法是向您的子例程添加另一个参数
subroutine interpol(nn,oo,n,interpolverdi)
integer :: nn(:), n,s,i
real(8) :: oo(:),interpolverdi
end subroutine interpol
我建议将参数或主程序变量重命名为其他名称,以便它们具有不同的名称。
顺便说一句 real(8)
非常难看而且不能完全移植。如果您正在学习 Fortran,请不要学习这个 坏 习惯。 Fortran 90 kind parameter Confusing double precision real in Fortran
我做了一个线性插值代码,但是当我试图在主程序或另一个子程序中得到这个值时,它显示的值是0.0000,但是当我运行子程序中的程序它得到正确的值。
write(,) 'Interpolverdi=',interpolverdi得到正确值 但是当我 运行 写 (,)'main interpolverdi',interpolverdi 我得到 0.0000
的值我的输入文件运行良好。
我做错了什么?如何从子程序中获取特定值,然后在另一个子程序中使用该值?
感谢您提供的所有帮助:)
!main.f90
program mainn
use inputt
use interpoll
!use mongo
implicit none
integer :: n, itmax,k,bc
real(8) :: epsilon, Re, tmax,dt,h,fux,interpolverdi
real(8), dimension (:), allocatable :: oo,u,v,p
integer, dimension (:), allocatable :: nn
!real(8), dimension(:,:), allocatable :: Uvel, Vvel, pres, psi
call lesinput(n,itmax,k,epsilon,Re,tmax,dt,oo,nn,bc)
call interpol(nn,oo,n)
write(*,*)'main interpolverdi',interpolverdi
end program mainn
!interpoll.f90
module interpoll
implicit none
contains
subroutine interpol(nn,oo,n)
integer :: nn(:), n,s,i
real(8) :: oo(:),interpolverdi
s = size(nn)
do i=1,s-1
if (n==nn(i)) then
interpolverdi= oo(i)
exit
else if ((n>nn(i)) .and. (n<nn(i+1))) then
interpolverdi= oo(i)+((oo(i+1)-oo(i))*(n-nn(i)))/(nn(i+1)-nn(i))
exit
else
interpolverdi=nn(s)
end if
end do
write(*,*) ' Interpolverdi=', interpolverdi
write(*,*)'n=',n
end subroutine interpol
end module interpoll
您有 两个不同的 变量,名为 interpolverdi
。一种在主程序中定义,一种在子程序中定义。
当您在主程序和子例程中执行 write(*,*) interpolverdi
时,它每次都会打印不同的变量。
如果想直接从内部子程序中改变主程序变量,从子程序中删除interpolverdi
的声明。
然而,更好的方法是向您的子例程添加另一个参数
subroutine interpol(nn,oo,n,interpolverdi)
integer :: nn(:), n,s,i
real(8) :: oo(:),interpolverdi
end subroutine interpol
我建议将参数或主程序变量重命名为其他名称,以便它们具有不同的名称。
顺便说一句 real(8)
非常难看而且不能完全移植。如果您正在学习 Fortran,请不要学习这个 坏 习惯。 Fortran 90 kind parameter Confusing double precision real in Fortran