Skip to content

Commit 202f475

Browse files
authored
Update ch05-00-function.md
1 parent f5a1738 commit 202f475

File tree

1 file changed

+32
-6
lines changed

1 file changed

+32
-6
lines changed

src/ch05-00-function.md

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44

55
## 函数的定义
66

7-
Fortran中,函数一般定义在`module`中,使用的时候,`use`这个`module`即可
7+
Fortran中,函数一般定义在`module`中,置于`contains`的后面,使用的时候,`use`这个`module`就可以导入这个函数。
8+
9+
首先用`fpm new my_func_mod`创建一个新的项目,然后将`module`文件放在`src/my_func_mod.f90`
810
``` fortran
9-
! 内积
11+
! 文件名src/my_func_mod.f90
1012
module my_func_mod
1113
implicit none
1214
contains
@@ -19,6 +21,7 @@ contains
1921
end function vector_norm
2022
end module my_func_mod
2123
24+
!文件名 app/main.f90
2225
program main
2326
use my_func_mod
2427
implicit none
@@ -27,20 +30,24 @@ program main
2730
write(*,*)vector_norm(a)
2831
end program main
2932
```
30-
33+
运行之后
34+
``` sh
35+
$ fpm run
36+
3.95600796
37+
```
3138
其中`result`表示函数的返回值是什么,同时我们还需要在函数体中定义返回的类型和属性。
3239
- Fortran中有许多针对数组的内置函数,熟练使用他们,可以减少代码的冗余,提高效率,此处`sum`表示对数组进行求和,`sqrt`表示对元素进行开方
3340

3441
如果返回值**没有属性,只有类型**,则可以将其写在函数的开头。
3542

43+
将如下的两个文件也放在`module`中,即`vector_norm2`的后面
3644
``` fortran
37-
! 内积
38-
real function vector_norm(vec) result(norm) !类型写在开头
45+
real function vector_norm2(vec) result(norm) !类型写在开头
3946
real, intent(in) :: vec(:)
4047
4148
norm = sqrt(sum(vec**2))
4249
43-
end function vector_norm
50+
end function vector_norm2
4451
4552
function double_vec(vec) result(vec2)
4653
real, intent(in) :: vec(:)
@@ -50,6 +57,25 @@ function double_vec(vec) result(vec2)
5057
5158
end function double_vec
5259
```
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+
```
5379
- `size` 函数返回数组的大小,如果是多维数组,返回的是**所有维度的乘积**
5480

5581
子过程的参数称为虚参,虚参一般会包含如下几个属性

0 commit comments

Comments
 (0)