前情提要:
一段fortran
代码可以包含多个module
,不同模块之间通过use
来互相调用
module cirfunc
implicit none
real, parameter :: pi = 3.1415926536
contains
function deg2rad(deg) result(rad)
real :: deg
real :: rad
rad = deg * pi / 360
end function deg2rad
end module cirfunc
program modTest
use cirfunc
implicit none
print*, "250° = ", deg2rad(250.0)
end program modTest
效果如下
>a.exe
250° = 2.18166161
其中cirfunc
就是一个模块,模块中定义了常数pi
,以及函数deg2rad
。在fortran中,模块如果包含函数或子过程,则顶以前必须使用contains
关键字。
后面modTest
调用cirfunc
时,需要使用use
。
如果担心use
过多引起命名冲突,可以使用only
,例如use cirfunc, only : deg2rad
。
fortran语言最近两年其实跳得很厉害,一点都不像是个66岁的老人,尤其20年的时候,还推出了包管理工具,实在是太夭寿了,这年头连fortran
都有包管理工具了……
下载地址在这fpm,下载之后免安装,只需将exe
的位置添加到环境变量,然后新开个命令行,输入fpm
有反应就行了
>fpm -v
Version: 0.7.0, alpha
Program: fpm(1)
Description: A Fortran package manager and build system
Home Page: https://github.com/fortran-lang/fpm
License: MIT
OS Type: Windows
其实fpm官网的中文版教程已经相当不错了,这里仅对其做一些简化。通过fpm
可以创建新的fortran
项目,只需在命令行中输入
❯ fpm new fpm1
然后会创建项目文件,其目录树如下,可见fpm
默认f90
版本。其中fpm.toml
是配置文件,toml
文件的第一版协议是2013年才有的,感觉十分魔幻。
├── README.md
├── app
│ └── main.f90
├── fpm.toml
├── src
│ └── fpm1.f90
└── test
└── check.f90
进入fpm1.f90
,可见其内容如下,是个hello world
小程序。
module fpm1
implicit none
private
public :: say_hello
contains
subroutine say_hello
print *, "Hello, fpm1!"
end subroutine say_hello
end module fpm1
这显然是个模块,但这个模块中出现了两个生词:private
和public
。如果有一点面向对象的经验,就会意识到这二者用于规定访问权限,private
为私有成员,外人不可调用,public
为共有成员,可以随意访问。
然后再看一下app/main.f90
,其内容如下,就是一个简单的调用语句,其中use
就是上面提到的模块导入字段,only
表示只导入fpm1
中的say_hello
。从这里也可以看出,fortran的模块是可以跨文件调用的。
program main
use fpm1, only: say_hello
implicit none
call say_hello()
end program main
接下来可在命令行中输入fpm run
来编译并运行fortran
程序,这个可比gfortran
方便多了
>fpm run
+ mkdir build\dependencies
fpm1.f90 done.
libfpm1.a done.
main.f90 done.
fpm1.exe done.
[100%] Project compiled successfully.
Hello, fpm1!