【问题标题】:Getting out variable from a subroutine从子程序中取出变量
【发布时间】:2016-02-24 09:52:49
【问题描述】:

我制作了一个线性插值代码,但是当我尝试在主程序或另一个子程序中获取该值时,它显示的值为 0.0000,但是当我在子程序中运行程序时,它得到了正确的值。

write(,) 'interpolverdi=',interpolverdi 得到正确的值 但是当我运行 write(,)'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

【问题讨论】:

  • 不要从您的问题中删除代码。它也适合未来的访客。

标签: fortran fortran90 gfortran


【解决方案1】:

您有两个不同的变量,称为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 parameterConfusing double precision real in Fortran

【讨论】:

  • 如何将它们变成 1 个变量?我试过real(8),在interpoll.f90中保存:: interpolverdi,没用……
  • @ursmooth 把它从子程序中删除就行了。 real(8) :: oo(:),interpolverdi => real(8) :: oo(:) 但你应该试着理解为什么它是必要的。
  • 我现在修好了,非常感谢!
猜你喜欢
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
相关资源
最近更新 更多