回 帖 发 新 帖 刷新版面

主题:无法读取subroutine中的数值 (已解决)

求 教 各 位 師 兄 師 姐 ﹕

需要編寫一個程序來進行計算。結構是先選擇K數值﹐  分為SUB K=1和SUB K=2兩種情況。 然後在 各自的SUB里調用一個可以改變參數的SUB P。 

遇到的問題是可以改變參數 ﹐ 但接下來讀取時發現數值為0﹐ 

懇 請 指 教!

程 序 是 這 樣 ﹕  
      program test
    implicit none
                                                   
      real*8 k,rIS,rnr

    print*,'First choose k value: (k=1 or 2)'
      print*, '1:k=',k,'(insert 1 or 2)'
      read(*,*) rnr
    if(rnr.eq.1) then 
    call subk1
      else if(rnr.eq.2) then 
    call subk2
    endif
    end

    subroutine p     
    rIS=2.0
100   print*, 'parameters now:'
      print*, ' 1: rIS =',rIS,'cm'
      print*,'Write number to change'
    print*,'If nothing change write 0 to continue.'
    read(*,*) rnr
      if(rnr.eq.0) then
      go to 199
      endif  
        go to
     1(101)
    2rnr    
101   print*,'change 1 rIS =',rIS
      read(*,*) rIS
      go to  100       
199   continue       
      return
    end

      subroutine subk1
    call p 
    write(6,*) 'setup1=',rIS 
    end

    subroutine subk2
      call p 
    write(6,*) 'setup2=',rIS 
    return
    end

回复列表 (共4个回复)

沙发

主程序的变量不是天然地就是全局变量. 老老实实传递给子程序吧.

板凳

使用 contains 之后就ok了...

程序变成:

      program test
      implicit none
                                                   
      real*8 k,rIS,rnr
    
    rIS=3.0

    print*,'First choose k value: (k=1 or 2)'
      print*, '1:k=',k,'(insert 1 or 2)'
      read(*,*) rnr
    if(rnr.eq.1) then 
    call subk1
      else if(rnr.eq.2) then 
    call subk2
    endif
    
    contains          ********************************** Orz *************************************

    subroutine p    
100   print*, 'parameters now:'
      print*, ' 1: rIS =',rIS,'cm'
      print*,'Write number to change'
    print*,'If nothing change write 0 to continue.'
    read(*,*) rnr
      if(rnr.eq.0) then
      go to 199
      endif  
        go to
     1(101)
    2rnr    
101   print*,'change 1 rIS =',rIS
      read(*,*) rIS
      go to  100       
     
199   return
    end subroutine p

      subroutine subk1

    call p
     print*,'changed rIS =',rIS
    return 
    end subroutine subk1

    subroutine subk2
      call p
    return
    end subroutine subk2

    end

3 楼

主程序中的变量自动共享于其contians中的各子程序及函数,所以要非常小心啊。
建议还是改用参数传递吧,这样保险些:)

4 楼

变量寿命范围心里要有个底, contains下的函数适合小规模的, 主函数变量覆盖整个contains, 如果规模大了就可能隐藏隐患了(如楼上建议).
B.T.W: goto这类旧用法还是尽量不要用了. 复杂了会很头晕.

我来回复

您尚未登录,请登录后再回复。点此登录或注册