Skip to content

Commit 7a8025c

Browse files
authored
Update ch07-01-procbind.md
1 parent 5798626 commit 7a8025c

File tree

1 file changed

+0
-145
lines changed

1 file changed

+0
-145
lines changed

src/ch07-01-procbind.md

Lines changed: 0 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -35,148 +35,3 @@ end program main
3535
- 使用`=>`可以为绑定的过程重命名。
3636
- 被绑定的变量名尽量使用`this`或者`self`(与其他语言的习惯相符)
3737

38-
## 函数重载
39-
40-
当定义的函数很多的时候,函数名会非常复杂,有时候我们希望可以简化,这时候,使用重载是一个选择。例如对于`vector`类型,我们希望它也可以通过传入一个数组来初始化。使用`generic`关键字就可以对函数进行重载
41-
42-
``` fortran
43-
module vector_mod
44-
implicit none
45-
type vector_t
46-
real,allocatable::x(:)
47-
contains
48-
generic::init=>vector_init,vector_init_array
49-
procedure,pass:: vector_init,vector_init_array
50-
end type vector_t
51-
contains
52-
subroutine vector_init(this,n)
53-
class(vector_t),intent(inout)::this
54-
integer,intent(in)::n
55-
allocate(this%x(n))
56-
end subroutine vector_init
57-
58-
subroutine vector_init_array(this,a)
59-
class(vector_t),intent(inout)::this
60-
real,intent(in)::a(:)
61-
allocate(this%x,source=a)
62-
end subroutine vector_init_array
63-
end module vector_mod
64-
65-
program main
66-
use vector_mod
67-
implicit none
68-
type(vector_t)::v
69-
type(vector_t)::va
70-
call v%init(10)
71-
call va%init([real::1,2,3,4])
72-
end program main
73-
```
74-
此时使用两种方式均可以对其进行初始化。
75-
76-
## 运算符重载
77-
78-
有时候,我们也希望对内置的运算符进行重载,用来提高代码的一致性。例如我们有一个分数类型,它有`+-*/``**`的操作,但是如果使用过程绑定的函数则显得代码过于臃肿。此时就可以使用运算符重载
79-
80-
``` fortran
81-
module frac_mod
82-
implicit none
83-
type frac
84-
integer(8)::num!numerator
85-
integer(8)::den!denominator
86-
contains
87-
generic::operator(.reduce.)=>cancelling !也可以使用自定义运算符
88-
generic::operator(+)=>add,add_frac_num,add_num_frac
89-
!generic::operator(-)=>sub
90-
!generic::operator(*)=>mult
91-
!generic::operator(/)=>div
92-
!generic::operator(**)=>pow
93-
!
94-
procedure,pass ::add,add_frac_num
95-
procedure,pass(this)::add_num_frac
96-
procedure,pass ::cancelling
97-
!procedure,pass::sub
98-
!procedure,pass::mult
99-
!procedure,pass::divi
100-
end type
101-
contains
102-
elemental function cancelling(this)result(z)
103-
class(frac),intent(in)::this
104-
type(frac) ::z
105-
! do something
106-
end function cancelling
107-
108-
type(frac) elemental function add(this,y)result(z)
109-
class(frac),intent(in)::this,y
110-
z%num=this%num*y%den+y%num*this%den
111-
z%den=this%den*y%den
112-
end function add
113-
114-
type(frac) elemental function add_frac_num(this,m)result(z)
115-
class(frac),intent(in)::this
116-
integer,intent(in) ::m
117-
z%num=this%num+this%den * m
118-
z%den=this%den
119-
end function add_frac_num
120-
121-
type(frac) elemental function add_num_frac(m,this)result(z)
122-
class(frac),intent(in)::this
123-
integer,intent(in) ::m
124-
z%num=this%num+this%den * m
125-
z%den=this%den
126-
end function add_num_frac
127-
end module frac_mod
128-
129-
program main
130-
use frac_mod
131-
implicit none
132-
type(frac)::x,y,z,w(2)
133-
x=frac(1,2)
134-
y=frac(2,3)
135-
w=[frac(1,4),frac(1,3)] !自定义类型数组初始化
136-
z=x+y
137-
write(*,*)z
138-
z=x+1
139-
write(*,*)z
140-
z=2+y
141-
write(*,*)z
142-
write(*,*)w+2 !也支持数组
143-
end program main
144-
```
145-
- 除此之外,也可以对比较运算符进行重载,注意比较运算符中运算符和其对应的旧形式属于同一个函数,不能重载为不同的功能。
146-
147-
## 赋值运算符的重载
148-
149-
赋值的运算符具有特有的形式`assignment(=)`
150-
151-
``` fortran
152-
module string_mod
153-
implicit none
154-
type string
155-
character(:),allocatable::str
156-
contains
157-
generic::assignment(=)=>equal
158-
procedure,pass::equal
159-
end type string
160-
contains
161-
subroutine equal(this,s)
162-
class(string),intent(inout)::this
163-
character(len=*),intent(in)::s
164-
this%str=s
165-
end subroutine equal
166-
end module string_mod
167-
168-
program main
169-
use string_mod
170-
implicit none
171-
type(string)::s
172-
s="123"
173-
!内置构造函数形式
174-
s=string("456")
175-
end program main
176-
```
177-
178-
## 习题
179-
- 请你尝试补充完所有的运算符
180-
- 尝试加入`gcd`对分数进行约分,补充`.reduce.`函数
181-
- (附加题)完成分数类,并使用高斯消元法求解希尔伯特矩阵的行列式和逆矩阵
182-

0 commit comments

Comments
 (0)