Fortran Coder

查看: 12926|回复: 3
打印 上一主题 下一主题

[Module] 如何确定被定义的变量属于哪个module

[复制链接]

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
跳转到指定楼层
楼主
发表于 2015-9-4 09:50:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨天发了个求助帖,不知道怎么了反正今天找不到了,什么提示都没有。不知道是网络问题还是哪些地方违规了被删除了。如果是后者,还请斑竹指出我哪里违规了,避免下次再犯。
关于我的问题是这样的。我在用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中的变量么?




分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2015-9-4 10:41:25 | 只看该作者
昨天可能服务器出了点问题,我们丢失了昨天的几个帖子。并无违规。

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

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

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

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
板凳
 楼主| 发表于 2015-9-4 12:19:44 | 只看该作者
fcode 发表于 2015-9-4 10:41
昨天可能服务器出了点问题,我们丢失了昨天的几个帖子。并无违规。

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

谢谢指点。

原来如此.

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

请问有没有方法来拒绝这一继承呢?感觉这样的话好危险,尤其是在修改别人的程序的时候。

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2015-9-4 13:01:01 | 只看该作者
没有办法来选择性的被继承。type 或许是个好办法。

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

目前 fortran 语法对变量的权限,只分为模块内部和模块外部。不再把外部划分成多个部分对待。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-24 20:10

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表