Fortran入门教程(十一)—— 模块

模块

很多情况下, 有一些编写的变量、常亮、派生类型、子例程、函数等是相互耦合的。可以将他们封装到一起形成模块,方便对这些程序的使用和管理。
创建模块就像是为程序代码创建文件夹,避免代码的臃肿。

11.1 模块定义

fortran中, 模块书写遵循如下语法:

module module_name
    ...     ! variable, type and cosntant
contains
    ...     ! subroutine, function
end module [module_name]

比如定义一个常用常量库:

module m_paramater
    implicit none
    real, parameter :: pi = acos(-1.)
    real, parameter :: ep = exp(1.)   
    integer :: prime_numbers_less_then_ten(4) = [2, 3, 5, 7]
end module

11.2 模块的使用

11.2.1 直接使用

fortranfunciton/subroutine/program都可以使用 use 语句来使用指定的模块, 如:

program test
    use module_name
    ...
end program

注意: use语句需要出现在implicit 语句之前。
当模块被使用后, 模块中定义的所有代码块将引用进当前作用域。
比如:

program main
    use m_paramater
end program

11.2.2 指定引用

为了避免变量名冲突, 引用模块时可以只引用部分内容或是给模块内变量更改名称, 需要使用到only语句。

module m_paramater
    implicit none
    real, parameter :: pi = acos(-1.)
    real, parameter :: ep = exp(1.)   
    integer :: prime_numbers_less_then_ten(4) = [2, 3, 5, 7]
end module
program main
    use m_paramater, only: pi
    implicit none
    write(*, *) pi
end program

11.2.3 重命名

有的模块中定义的变量可能和程序需要使用的变量同名, 这时可以用=>将其改名。

use m_paramater, only: constants_pi => pi

=>后面指向的是模块中的名字, 前面是重命名的名字。

11.3 模块成员管理

部分模块中的函数或是变量由于安全性问题, 不便于暴露给外部使用, 不希望或是不能被外部修改, 这时可以用private或是public关键字来指明模块中的内容是否暴露给外部, 默认情况下, 模块的所有成员都是public的, 也就是外部可以任意进行调用。
private修饰的成员称为私有成员, public修饰的成员称为公共成员。

使用private关键字可以将模块中的成员隐藏, 如:

module m_paramater
    implicit none
    real, parameter, private :: pi = acos(-1.)
    real, parameter :: ep = exp(1.)   
    integer :: prime_numbers_less_then_ten(4) = [2, 3, 5, 7]
end module
program main
    use m_paramater
    implicit none
    write(*, *) pi
end program

注意模块中中pi变量被赋予了private属性。
该程序会报错

12 |     write(*, *) pi
   |                  1
Error: Symbol 'pi' at (1) has no IMPLICIT type

也可以直接使用private关键字来改变模块成员默认是否暴露如:

module m_name
    private
    integer :: a, b, c
    integer, public :: d
end module

此时模块中的所有变量默认都是私有的,
a, b, c不会暴露给外部, d暴露给外部。

另外, 在模块中编写的function/subroutine不需要编写接口, 因此, 一种良好的编程习惯是: 所有的function/subroutine都要放进module中, 不应该有野函数。
用这样的方式, 既不需要书写interface, 也可以更好的管理函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sumbrella_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值