回 帖 发 新 帖 刷新版面

主题:公用数组如何传递子函数的结果?

新手上路,请大家多多指点!
 请教个问题,我定义的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个回复)

沙发

不会出现你说的错误啊!按你的意思,不知道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

板凳

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 楼


如果有名公用区中出现字符型变量,则要求整个公用区中的变量都具有字符类型。也就是不允许字符变量与其它变量放在同一个有名公用区中。

可以把 '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 楼

建议还是别再用COMMON了,取而代之使用MODULE会更便于维护:)

我来回复

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