Fortran Coder

查看: 30408|回复: 5
打印 上一主题 下一主题

[Module] 新手问几个关于module的使用问题

[复制链接]

10

帖子

4

主题

0

精华

入门

F 币
51 元
贡献
31 点
跳转到指定楼层
楼主
发表于 2017-1-24 21:43:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、module只能写在程序最前面吗?
2、module中用read读入文件怎么实现?一定要用contains+subroutine吗?
3、我要定义一个数组类型,这样可以么?
[Fortran] 纯文本查看 复制代码
MODULE parameters

INTEGER,PARAMETER :: n1=1000
INTEGER,PARAMETER :: n2=1000
INTEGER,PARAMETER :: n3=1000
INTEGER,PARAMETER :: n4=20000

INTEGER,PARAMETER :: n=441
INTEGER,PARAMETER :: m=226

END MODULE parameters


MODULE fjgj
USE MODULE parameters
REAL,DIMENSION(n1) :: fj, gj
    END MODULE fjgj

除了n1,n2,n3,n4,n,m之外,我的module里的变量是一直会变的。比如这里的fj,gj会在多个子程序里调用,所以单独列了一个module。
刚刚从fortran77 语法转过来,以前都用common,module实在不太会用,望各位大神指教。


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

736

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
700 元
贡献
359 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2017-1-24 23:05:01 | 只看该作者
1. 不是必须写最前面。而是:
module 必须写在 use 这个module的程序单元的前面。
如果写在同一个源代码里,那么应该写在前面。
如果写在多个源代码里,应该保证module先于use这个module的程序单元编译。

2. module 中不能直接书写执行语句(比如read)
所有执行语句必须写在contains下面的subroutine(或function)中

3. 可以这样
module并没有改变以前关于数组大小,数组维度,常量与变量的关系。

更多内容,可以收看本站视频教程:
http://v.fcode.cn/video-module.html

10

帖子

4

主题

0

精华

入门

F 币
51 元
贡献
31 点
板凳
 楼主| 发表于 2017-1-25 10:38:54 | 只看该作者
楚香饭 发表于 2017-1-24 23:05
1. 不是必须写最前面。而是:
module 必须写在 use 这个module的程序单元的前面。
如果写在同一个源代码里 ...

好的,非常感谢您的回答。我再追问两个问题:
[Fortran] 纯文本查看 复制代码
MODULE DC_flow
USE MODULE parameters
REAL,DIMENSION(n1) :: qo, zo
    CONTAINS
    Subroutine fileread4
!Initial Conditions
  Open (1, File='DINI_1%.txt', Status='old')
  Read (1, *)(qo(j), j=1, ns)
  Read (1, *)(zo(j), j=1, ns)
  Close (1)
    END Subroutine fileread4
  
    END MODULE DC_flow

这个代码里面的qo,zo虽然是读进来的,但之后的值会发生改变,加入下次使用这个module的时候,是不是qo,zo的值还是初始在module中读入的值啊?

2、在使用subroutine的时候,一般都是SUBROUTINE BOUND(A,A1,IA,J,IGG,KD)的格式,但是我公用的变量过多,可不可以省略变量,直接用CALL SUBROUTINE BOUND(),不写变量啊?

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
地板
发表于 2017-1-25 10:48:21 | 只看该作者
1. module是函数过程和变量的集合。并不能“下次使用module”,只能下次使用“qo”或 "zo"
2. qo 和 zo 的值会保持不变,直到你下次改变它。(而不管在哪里使用)
3. 可以省略函数的虚参,即只写 call bound() 【注意不是 call subroutine bound()
4. 自己打开文件,请使用 10 以上的通道号,不要用 1 这个通道号
5. Read( 1 , * ) (qo(j),j=1,ns) 可以简写为  Read( 1 , * ) qo(1:ns)

10

帖子

4

主题

0

精华

入门

F 币
51 元
贡献
31 点
5#
 楼主| 发表于 2017-1-25 11:09:23 | 只看该作者
vvt 发表于 2017-1-25 10:48
1. module是函数过程和变量的集合。并不能“下次使用module”,只能下次使用“qo”或 "zo"
2. qo 和 zo 的 ...

非常感谢,很有帮助。
我现在面临一个问题是,之前写了两个子程序1和2,分别计算两个部分。现在需要写一个主程序把他俩结合起来,其实这样写就可以实现这个功能:
[Fortran] 纯文本查看 复制代码
PROGRAM MAIN
      
 WRITE(*,*) ('Start 1D calculation……')
      
      CALL RIVER_1D
      WRITE(*,*) ('1D calculation end')
      
      WRITE(*,*) ('Start 2D calculation……')
      CALL RIVER_2D

      STOP
      END

但是为了输入数据都在主程序里输入,需要把共享的变量都提到主程序中来,该怎么实现呢?之前用fortran77的语法,这些公用数据的形式有这些种类:
[Fortran] 纯文本查看 复制代码
PARAMETER (N1=1000,N2=1000,N3=1000,N4=20000)
COMMON/BL1/ZO(N1),QO(N1),VO(N1)
COMMON/BL2/ZN(N4,N1),QN(N4,N1),VN(N4,N1)
COMMON/BL5/T
……

当然还有很多其他的,请问用社么方法可以最好的实现“变量从子程序中提取到主程序这个功能”呢?

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
6#
发表于 2017-1-25 18:02:59 | 只看该作者
可以把变量改到module里,然后分别 use 这个module即可。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-24 09:30

Powered by Tencent X3.4

© 2013-2024 Tencent

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