4
4
5
5
## 函数的定义
6
6
7
- Fortran中,函数一般定义在` module ` 中,使用的时候,` use ` 这个` module ` 即可
7
+ Fortran中,函数一般定义在` module ` 中,置于` contains ` 的后面,使用的时候,` use ` 这个` module ` 就可以导入这个函数。
8
+
9
+ 首先用` fpm new my_func_mod ` 创建一个新的项目,然后将` module ` 文件放在` src/my_func_mod.f90 ` 中
8
10
``` fortran
9
- ! 内积
11
+ ! 文件名src/my_func_mod.f90
10
12
module my_func_mod
11
13
implicit none
12
14
contains
@@ -19,6 +21,7 @@ contains
19
21
end function vector_norm
20
22
end module my_func_mod
21
23
24
+ !文件名 app/main.f90
22
25
program main
23
26
use my_func_mod
24
27
implicit none
@@ -27,20 +30,24 @@ program main
27
30
write(*,*)vector_norm(a)
28
31
end program main
29
32
```
30
-
33
+ 运行之后
34
+ ``` sh
35
+ $ fpm run
36
+ 3.95600796
37
+ ```
31
38
其中` result ` 表示函数的返回值是什么,同时我们还需要在函数体中定义返回的类型和属性。
32
39
- Fortran中有许多针对数组的内置函数,熟练使用他们,可以减少代码的冗余,提高效率,此处` sum ` 表示对数组进行求和,` sqrt ` 表示对元素进行开方
33
40
34
41
如果返回值** 没有属性,只有类型** ,则可以将其写在函数的开头。
35
42
43
+ 将如下的两个文件也放在` module ` 中,即` vector_norm2 ` 的后面
36
44
``` fortran
37
- ! 内积
38
- real function vector_norm(vec) result(norm) !类型写在开头
45
+ real function vector_norm2(vec) result(norm) !类型写在开头
39
46
real, intent(in) :: vec(:)
40
47
41
48
norm = sqrt(sum(vec**2))
42
49
43
- end function vector_norm
50
+ end function vector_norm2
44
51
45
52
function double_vec(vec) result(vec2)
46
53
real, intent(in) :: vec(:)
@@ -50,6 +57,25 @@ function double_vec(vec) result(vec2)
50
57
51
58
end function double_vec
52
59
```
60
+ 修改主函数
61
+
62
+ ``` fortran
63
+ program main
64
+ use my_func_mod
65
+ implicit none
66
+ real::a(3)
67
+ a=[real::1.0,2.1,3.2]
68
+ write(*,*)vector_norm(a)
69
+ write(*,*)vector_norm2(a)
70
+ write(*,*)double_vec(a)
71
+ end program main
72
+ ```
73
+ ``` sh
74
+ $ fpm run
75
+ 3.95600796
76
+ 3.95600796
77
+ 2.00000000 4.19999981 6.40000010
78
+ ```
53
79
- ` size ` 函数返回数组的大小,如果是多维数组,返回的是** 所有维度的乘积**
54
80
55
81
子过程的参数称为虚参,虚参一般会包含如下几个属性
0 commit comments