主题:公用数组如何传递子函数的结果?
hellen40
[专家分:0] 发布于 2010-09-01 10:56:00
新手上路,请大家多多指点!
请教个问题,我定义的common数组,为什么在调用子函数后,数据不能从子函数中传出来呢?
代码如下:
'SegWCom.tyt'中:
COMMON /datcom/ SegRHS(50)
主程序中:
PROGRAM MAIN
include 'SegWCom.tyt'
DO 708 L=1,50
equSeg(L)=1.0
708 CONTINUE
call testCommonArr
stop
END
子程序:
SUBROUTINE testCommonArr
include 'SegWCom.tyt'
DO 709 L=1,4
SegRHS(L)=5.0
709 CONTINUE
RETURN
END
SegRHS(50)数组,是个common公用变量,我期待它可以在主函数和子函数testCommonArr中通用。在主程序中,我将其全部赋值为1.0。然后调用子函数,将其中的前四个变量设为5.0,回到主程序后,应该得到的数组是,前4个为5.0,后46个为1.0。可是我看到的是50个1.0,谁能帮我解释一下,问题出在哪里?
回复列表 (共4个回复)
沙发
jstzhurj [专家分:4680] 发布于 2010-09-01 11:42:00
不会出现你说的错误啊!按你的意思,不知道equSeg(L)=1.0
是不是笔误?似乎应为SegRHS(L)=1.0。
PROGRAM MAIN
include 'SegWCom.tyt'
SegRHS=1.0
call testCommonArr
print*, SegRHS
stop
END
SUBROUTINE testCommonArr
include 'SegWCom.tyt'
DO 709 L=1,4
SegRHS(L)=5.0
709 CONTINUE
RETURN
END
打印结果:
5.000000 5.000000 5.000000 5.000000 1.000000
1.000000 1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000 1.000000
板凳
hellen40 [专家分:0] 发布于 2010-09-01 15:20:00
jstzhurj老师,你好!谢谢你的指点。确实如你所说,equSeg(L)=1.0是个笔误。
这个问题是我程序的一部分,贴帖子的时候单独摘出来的。如果只有这部分,运行正常(看了你的帖子才知道[em8])。实际上,我的 'SegWCom.tyt'中,还定义了其他common变量(如下:)
implicit double precision (o-z, a-h)
COMMON /datcom/ sline(lmxcol)
COMMON /datcom/ fARR(LARR)
COMMON /datcom/ SegRHS(50)
其中,fARR和SegRHS是real,sline我希望是字符型。因此,在主程序中,我定义了sline的类型:
character sline*1
就是这条语句导致 SegRHS 数组的返回值出错,请问,应该如何修改呢?
我试过如下两种方式对fARR和SegRHS重新定义类型:
(1)
real fArr(LARR)
real SegRHS(50)
系统提示错误,说重复定义了;
(2)
real fArr
real SegRHS
系统提示Warning: Because of COMMON, the alignment of object is inconsistent with its type [FARR]
Warning: Because of COMMON, the alignment of object is inconsistent with its type [SEGRHS]
程序运行后,SegRHS的结果就不再是4个5.0,46个1.0了,而是50个1.0.
3 楼
jstzhurj [专家分:4680] 发布于 2010-09-01 16:22:00
如果有名公用区中出现字符型变量,则要求整个公用区中的变量都具有字符类型。也就是不允许字符变量与其它变量放在同一个有名公用区中。
可以把 'SegWCom.tyt'改成:
implicit double precision (o-z, a-h)
character*1 sline
COMMON /datcom1/ sline(lmxcol)
real fARR,SegRHS
COMMON /datcom2/ fARR(LARR),SegRHS(50)
所以,拿一部分出来问问题容易断章取义!
4 楼
cgl_lgs [专家分:21040] 发布于 2010-09-02 01:09:00
建议还是别再用COMMON了,取而代之使用MODULE会更便于维护:)
我来回复