回 帖 发 新 帖 刷新版面

主题:子程序调用过程中遇到的疑问

最近在编写程序的过程中遇到这样一个问题,在子程序中定义的程序段如下,其中含有do循环:
SUBROUTINE SSF_ZH1(LAM,PER,omg_L,OMG_ZH1,OMG_ZH2,BETA1,OMG_ZH)
……
do kk=1,10
PART=PART+PER*(1-LAM)**((omg_L/OMG_ZH)**BETA1)
end do
……
而在主程序调用时,相应程序段为:
do jj=1,mm
……
CALL SSF_ZH1(lamd(jj),PSHL(i-1,j,kk),omg(I,J,kk),omg(I,J,1),omg(I,J,LJS),BETA,OMG_ZH(i,j,jj))
……
end do
end do

其中的PSHL(i-1,j,kk)即对应子程序中的PER,最后希望从子程序中得到的结果是OMG_ZH。
调用一次子程序,子程序做kk次循环。得到OMG_ZH,将其赋给OMG_ZH(i,j,jj)。主程序中一共执行mm次子程序过程。
现在的问题是:主程序中的kk值不知道该如何处理,因为kk在子程序中已经循环完毕了,在主程序中是不用循环的。但是如果不在主程序中声明kk的值,程序又无法计算。
目前正在困惑中……望高手不吝赐教!

回复列表 (共6个回复)

沙发

调用一次子程序,子程序做kk次循环?我看是10次啊,把子程序的kk换掉,非得用kk吗?最好把程序完整贴出来,这样容易断章取义。

板凳

问题的关键不在于替换kk的问题,假设用kkk替换:
do kkk=1,10
PART=PART+PER*(1-LAM)**((omg_L/OMG_ZH)**BETA1)
end do
上面子程序循环中的PER是否需要换成数组的形式?它对应的是主程序中的PSHL(i-1,j,kk)。问题在于,在调用的时候,主程序中的kk如何指定?
CALL SSF_ZH1(lamd(jj),PSHL(i-1,j,kk),omg(I,J,kk),omg(I,J,1),omg(I,J,LJS),BETA,OMG_ZH(i,j,jj))

3 楼


实在是看不明白,把完整程序打包上传。

4 楼

contains subroutine试下呢

5 楼

内部子程序

6 楼


不用管它。
kk是子程序局部变量,不会在主程序和子程序之间传递。除非你声明了save属性。

我来回复

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