Fortran Coder

标题: 如何确定被定义的变量属于哪个module [打印本页]

作者: Villain    时间: 2015-9-4 09:50
标题: 如何确定被定义的变量属于哪个module
昨天发了个求助帖,不知道怎么了反正今天找不到了,什么提示都没有。不知道是网络问题还是哪些地方违规了被删除了。如果是后者,还请斑竹指出我哪里违规了,避免下次再犯。
关于我的问题是这样的。我在用VS2008,要把两个数值模型结合成一个。由于两个模型中有重复的变量,我正在处理如何统一这些变量的问题。在这一过程中,我发现了一个很奇怪的现象。用简单的言语描述就是:
用module A定义了一个变量n,在module B中引用了module A, 然后再在子程序C中用了module B,然后设定了implicit none,后来发现在没有定义x的情况下,竟然通过了编译。如果屏蔽子程序CC中的module B,则报错提示未对x定义。
为了方便阅读,我用等效的一段代码来描述我的问题。
[Fortran] 纯文本查看 复制代码
module A
  integer::n
end module A

module B
  use A
  implicit none
  real,allocatable::y(:)
  contains
    subroutine Kk
      n=3
      allocate(y(n))
    end subroutine kk
end module B

program xx
  use B
  implicit none
  call kk
  call cc
  pause
end program
  
subroutine cc
  use B
  implicit none
  integer::I
  do I=1,N
    write(*,*)I,N
    pause
  enddo
end subroutine  
   

运行的结果是 能正确显示N=3

也就是在Fortran中说如果一个模块A引用了模块B(模块A中使用 use B),那么在用模块A的时候,也能用模块B中的变量么?





作者: fcode    时间: 2015-9-4 10:41
昨天可能服务器出了点问题,我们丢失了昨天的几个帖子。并无违规。

是的,模块可以继承。所以主程序和 CC 可以使用 n

因此,在较大的程序里,我建议module的public变量,都增加前缀,例如 a_n。

更好的办法是,module 不定义public变量,而只定义 type,而在实际实用的module中定义该type的实例。

作者: Villain    时间: 2015-9-4 12:19
fcode 发表于 2015-9-4 10:41
昨天可能服务器出了点问题,我们丢失了昨天的几个帖子。并无违规。

是的,模块可以继承。所以主程序和 CC  ...

谢谢指点。

原来如此.

用type感觉确实条理清晰了,可是对于一个不系统的变量用type感觉有点麻烦。

请问有没有方法来拒绝这一继承呢?感觉这样的话好危险,尤其是在修改别人的程序的时候。
作者: fcode    时间: 2015-9-4 13:01
没有办法来选择性的被继承。type 或许是个好办法。

如果你定义为 private,则 module B 也不能使用。如果 module B 能使用,那么其他模块或子程序也可以使用。

目前 fortran 语法对变量的权限,只分为模块内部和模块外部。不再把外部划分成多个部分对待。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2