Fortran笔记,Module

本文详细介绍了Fortran95中的Module特性,包括变量、自定义类型和函数的声明与使用。Module用于封装程序模块,提供全局变量的两种实现方式,并强调了变量的生存周期管理。此外,讲解了如何定义和使用自定义类型,以及Module中包含的函数。Public和Private关键字用于控制访问权限,Use命令则用于在不同程序单元间共享Module资源。通过具体示例,展示了Module在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:彭国伦:《Fortan 95程序设计》,2002年。第8章,第11章

结构

  1. Module中的变量
  2. Module中的自定义类型
  3. Module中的函数
  4. Public, Private
  5. Use

使用场景:Module可以用来封装程序模块,通常用来把程序中,具备相关功能的函数及变量封装在一起(在Fortran 90中新加入的)

基本语法:

module module_name
 implicit none

! declaration of variables
... ...

end module [module_name]

1. Module中的变量

按之前的介绍,全局变量用COMMON实现。详见:http://t.csdn.cn/AsrUe

通过Module也可实现全局变量,

方法一:使用COMMON

方法二:在Module中定义的变量通过SAVE属性修饰

module global
    implicit none
    ! 全局变量的方式1:commmon修饰
    integer :: global_a
    common global_a
    ! 全局变量的方式2:save属性
    integer,save :: global_b
    ! ?全局变量(使用ivf编译器),其他编译器可能为局部变量
    integer :: global_c
end module global

program module_variable
	use global
	implicit none

	! Variables
	
	! Body of Program
	! global_x are variable in module global
    write(*, *) global_a, global_b, global_c
    call module_f()
    write(*, *) global_a, global_b, global_c
	
	stop
end program module_variable
	
subroutine module_f()
    use global
    implicit none
	
	global_a = 111
	global_b = 222
	global_c = 333
end subroutine module_f

输出结果为:

           0           0           0
         111         222         333

尽管不同的编译器对于没有save修饰的module中的变量是否为全局变量处理方式可能不尽相同,但是,这里提醒我们要注意module中的变量生存周期。

上例还包含了使用Module的若干规则:

  1. 需要使用这些变量的函数时(在program或这某个module中)只要USE这个Module即可;
  2. Module的代码需要需要编写在USE Module之前。

2. Module中的自定义类型

若试图在不同的函数中使用自定义类型(TYPE),应当试图让这些函数“明白”该自定义类型。一个常用的方法是将自定义类型封装在某个Module中,在需要使用的地方USE这个Module。

示例:

module module_pupil
    implicit none
    type :: pupil
        integer :: age
        real :: height
        character :: gender
    end type
end module module_pupil


program module_type
    use module_pupil
    implicit none

    type(pupil) :: pup_one

    pup_one = pupil(8, 130.0, 'B')

    call show_pup( pup_one )
end program module_type

subroutine show_pup(pup)
    ! 使用module_pupil,让函数知道type(pupil)
	use module_pupil
	implicit none
	type(pupil) :: pup
	write(*, *) pup
end subroutine

输出结果为:

           8   130.0000     B

3. Module中的函数

语法:

在关键词contains之后添加函数

module module_name
    ... ...
    ! 声明相关变量,自定义类型
    ... ...

contains
 subroutine sub_name
    ... ...
    ... ...
 end subroutine sub_name
 
 function func_name
    ... ...
    ... ...
 end function func_name

end module

同一个Module中,函数可以直接使用所声明的变量(注意,变量声明在前,contains之后才是函数的定义;module中不允许对变量进行赋值的操作!!!)
 

Visual Fortran提供一些扩充函数库就用这个方法来归类:
数值函数库,IMSL,存放在module IMSL中;
3D绘图库,OpenGL,存放在module OpenGL中。

使用前须 use IMSL, use OpenGL


4. Public, Private

Module里面的变量和函数,可以通过Public或Private来区分成公开或私有。

公开,就是任何Use这个Module的地方都可访问(默认的)。

私有,就是相关变量和函数仅限于该Module内部使用。

一些使用问题放在重载,继承的部分介绍。。。


5. Use

编写好Module之后,要使用Use命令才能让Module外的函数使用Module里面的东西。

为了避免变量或函数名称重复,Use命令后面,可以临时把Module里面的变量或函数名称改名。

语法:

module mod_a
    implicit none
    integer va

contains
    function fa(...)
        ...
    end function
end module mod_a

program rename
    use mod_a, aa=>va, ba=>fa
    implicit none
    ...
end program rename

如果不需要使用Module中的所有公开的变量、函数,可以通过Only命令来选择只使用部分。这样可以避免重名的问题。

语法:

module mod_a
    implicit none
    integer va

contains
    function fa(...)
        ...
    end function
end module mod_a

program rename
    use mod_a, only: fa
    ! only后也可重命名
    ! use mod_a, only: ba=>fa 
    implicit none
    ...
end program rename

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值