1
2009-7-29
§ 1 等价语句 (equivalence语句 )
等价语句,使同一程序单元中的多个变量共用同一个存储单元。
§ 2 公用语句 (common语句 )
公用语句,使不同程序单元的变量共用同一个存储单元。
§ 3 数据块子程序 (自学 )
数据块子程序,给公用区中的变量赋初值。
第 12章 数据共用存储单元和数据块子程序
2
2009-7-29
§ 1 等价语句 (p292-294)
等价语句 (即 equivalence语句 )的作用是使 本程序单元中的多个变量共用同一个存储单元 。
一般形式:
功能,每一对括号内变量表中的变量将占用同一个存储单元,通常称这些变量 等价 。
如:
⑴ 每个变量表中至少应有两个变量,变量之间用逗号隔开,变量可以是普通变量、数组或数组元素,但不能是虚参。
equivalence (变量表 1),(变量表 2),…
equivalence (w,st),(im,npl,jj2,neg)
§ 1 等价语句
3
2009-7-29
⑵ 变量表中的变量类型既可以相同也可以不同:当类型相同时,变量将具有相同的值;当类型不同时,由于不同类型变量所占的存储单元长度不同,变量将不具有相同的值。
【 例 12.1】
【 例 12.2】
equivalence (im,npl,jj2,neg)
im=1
write(*,*)im,npl,jj2,neg
end
equivalence (a,b,m)
a=1.0
write(*,*)a,b,m
end
§ 1 等价语句
4
2009-7-29
⑶ 当变量表中的变量是数组名或数组元素、且数组的类型相同时,则每个数组中相对应的数组元素将共用同一个存储单元。
如:
如:
real a(8),b(4,2),c(2,2,2)
equivalence (a,b,c)
§ 1 等价语句
a(1)
b(1,1)
c(1,1,1)
a(2)
b(2,1)
c(2,1,1)
a(3)
b(3,1)
c(1,2,1)
a(4)
b(4,1)
c(2,2,1)
a(5)
b(1,2)
c(1,1,2)
a(6)
b(2,2)
c(2,1,2)
(a7)
b(3,2)
c(1,2,2)
a(8)
b(4,2)
c(2,2,2)
real a(2,3),b(4)
equivalence ( a(2,2),b(2) )
a(1,1) a(2,1) a(1,2)
b(1)
a(2,2)
b(2)
a(1,3)
b(3)
a(2,3)
b(4)
5
2009-7-29
b(4)b(3)b(2)b(1)
c(8)c(7)c(3)c(1) c(6)c(2)
如:
⑷ 当变量表中的变量是数组名或数组元素、但数组的类型不同时,则每个数组中的数组元素是按照其存储长度对应的。
如:
§ 1 等价语句
a(1,1) a(2,1) a(1,2)
c
b(1)
a(2,2)
b(2)
a(1,3)
b(3)
a(2,3)
b(4)
real a(2,3),b(4)
equivalence ( a(1,2),c ),( b(1),c )
real b(4)
character c(8)
equivalence ( b(2),c(2) )
设一个实型数据占
4个字节,一个字符型数据占 1个字节。
c(4) c(5)
6
2009-7-29
⑸ 不能利用等价语句建立矛盾的等价关系。
如:
如:
练习:教材 p301习题一、习题二。
§ 1 等价语句
real a(10)
equivalence ( x,a(1) ),( x,a(3) )
real a(5),b(10)
equivalence ( a(1),b(2) ),( a(3),b(3) )
1,dimension a(5),b(3)
equivalence (a(3),b(2))
习题一 a(1)
a(2)
a(3)
a(4)
a(5)
b(1)
b(2)
b(3)
7
2009-7-29
c(1)
2,dimension e(2,2,2),f(5)
equivalence (e(2,1,2),f(4))
§ 1 等价语句
e(1,1,1)
e(2,1,1)
e(1,2,1)
e(2,2,1)
e(1,1,2)
e(2,1,2)
e(1,2,2)
e(2,2,2)
f(1)
f(2)
f(3)
f(4)
f(5)
3,integer i(3)
character*2 c(5)
real r(8)
equivalence (r(2),c(2)),(i,c)
r(1)
r(2)
r(3)
r(4)
r(5)
r(6)
r(7)
r(8)
c(2)
c(3)
c(4)
c(5)
i(1)
i(2)
i(3)
8
2009-7-29
§ 1 等价语句
4,integer i(6)
character*8 d(4)
equivalence (d(1),r),(d(2),c),(d(3),i(2))
d(1)
d(2)
d(3)
d(4)
r
c
i(2)
i(3)
i(4)
i(5)
i(1)
i(6)
9
2009-7-29
§ 2 公用语句 (p294-299)
common语句的作用是 使不同程序单元的变量共用同一个存储单元,从而使这些变量具有相同的值,实现不同程序单元之间的数据传递。
不同程序单元之间的数据传递有两种实现方式:① 采用实参和虚参结合的形式实现 ;② 利用 common语句实现 。
在一个 Fortran程序运行时,不同程序单元的变量共用的存储单元放在内存中该程序的一个公用数据区内,称为公用区 。
公用区实现的是一种全局变量的功能,只不过在不同的程序单元中变量的名字不同而已 。
§ 2 公用语句
10
2009-7-29
公用区有两种类型,① 无名公用区,任何一个 Fortran
程序中只可能有一个无名公用区; ② 有名公用区,一个
Fortran程序中根据需要可以有多个有名公用区。
一、无名公用区建立无名公用区的 common语句的一般形式:
【 例 12.3】
common 变量 1,变量 2,…
common x,y,i
data x,y,i/1.0,2.0,3/
call sub
end
subroutine sub
common a,b,j,w
w=j*(a+b)
write(*,*)a,b,j,w
end
§ 2 公用语句
11
2009-7-29
程序 在编译时 将开辟一个无名公用区,公用区中存储单元的个数等于 变量最多的 common语句中的变量个数 。
程序在运行时,从主程序开始执行,当遇到主程序中的 common语句时,将给无名公用区内的头三个存储单元依次命名为是 x,y,i。
当调用并执行子程序 sub时,遇到子程序中的 common
语句时,将给无名公用区中的四个存储单元依次命名为 a、
b,j,w。
§ 2 公用语句
common x,y,i
data x,y,i/1.0,2.0,3/
call sub
end
subroutine sub
common a,b,j,w
w=j*(a+b)
write(*,*)a,b,j,w
end
12
2009-7-29
【 例 12.4】 利用子程序求一元二次方程的两个根,数据传递采用不用的方式。
方式一,完全采用虚实参数结合的方式传递数据。
§ 2 公用语句
read(*,*)a1,a2,a3
call quad(a1,a2,a3,z1,z2)
write(*,*)z1,z2
end
subroutine quad(a,b,c,x1,x2)
p=-b/(2.0*a)
q=sqrt(b**2-4.0*a*c)/(2.0*a)
x1=p+q
x2=p-q
end
13
2009-7-29
方式二,通过虚实参数结合和公用区两种方式传递数据。
§ 2 公用语句
common z1,z2
read(*,*)a1,a2,a3
call quad(a1,a2,a3)
write(*,*)z1,z2
end
subroutine quad(a,b,c)
common x1,x2
p=-b/(2.0*a)
q=sqrt(b**2-4.0*a*c)/(2.0*a)
x1=p+q
x2=p-q
end
14
2009-7-29
方式三,完全通过公用区传递数据。
§ 2 公用语句
common a1,a2,a3,z1,z2
read(*,*)a1,a2,a3
call quad
write(*,*)z1,z2
end
subroutine quad
common a,b,c,x1,x2
p=-b/(2.0*a)
q=sqrt(b**2-4.0*a*c)/(2.0*a)
x1=p+q
x2=p-q
end
15
2009-7-29
common语句的使用规则和特点,
⑴ common语句是说明语句,在一个程序单元内它必须出现在所有可执行语句之前。
⑵ common语句中允许出现普通变量名,数组名和 数组说明符 (注意,不是数组元素 ),但不能出现虚参。
如:
⑶ 与 equivalence语句不同,各程序单元 common语句中占用同一个存储单元的变量类型必须相同。
§ 2 公用语句
common a,b,np(15),loc(2,4)
dimension np(15),loc(2,4)
common a,b,np,loc
16
2009-7-29
如:
⑷ 一个程序只能有一个无名公用区。当一个程序单元有多个 common语句时,这些语句中的变量按先后顺序占用无名公用区内的存储单元 。
如:
⑸ 注意 equivalence语句和 common语句的区别:
equivalence语句是使 同一程序单元内的多个变量共用同一个存储单元; common语句是使不同程序单元的变量共用同一个存储单元。
§ 2 公用语句主程序:
common a(5),i
子程序:
common b(4),i,p
主程序:
common a,b,c,d
common w(5)
子程序:
common a1,b1,c1,d1
common a,b
common c
17
2009-7-29
二、有名公用区一个程序可以有多个有名公用区,有名公用区也是利用 common语句进行说明。 形式:
注,?公用区名放在两个斜杠之间,其取名方法与变量一样,公用区名可以和本程序单元中的变量同名,变量表中有多个变量时用逗号隔开。
如:
可以用两个连续的斜杠表示无名公用区 。
common /公用区名 1/变量表 1 /公用区名 2/变量表 2…
common /a/ a,b,c /b/ x,y,z
§ 2 公用语句
18
2009-7-29
如:
如:
§ 2 公用语句
common r,x,y,z /c2/ a,b,c
common / / r,x,y,z /c2/ a,b,c
common /c2/ a,b,c / / r,x,y,z
主程序:
common r,x,y,z /c2/a,b,c /c3/u,v,w /c4/i
sub1:
common r1,x(3)
sub2:
common r2 /c2/a2,b2,c2
sub3:
common r3 /c3/u3,v3,w3
sub4:
common r4 /c4/i
19
2009-7-29
§ 2 公用语句主程序:
common r,x,y,z /c2/a,b,c /c3/u,v,w /c4/i
sub1:
common r1,x(3)
sub2:
common r2 /c2/a2,b2,c2
sub3:
common r3 /c3/u3,v3,w3
sub4:
common r4 /c4/i
主程序,r x y z
sub1,r1 x(1) x(2) x(3)
sub2,r2
sub3,r3
sub4,r4
无名公用区 有名公用区 c2
主程序,a b c
sub2,a2 b2 c2
有名公用区 c3
主程序,u v w
sub3,u3 v3 w3
c4
主程序,i
sub4,i
20
2009-7-29
练习:教材 p301习题五
1.
2.
主程序:
common a,b,c,d
子程序:
common x,y,z
无名公用区主程序,a b c d
子程序,x y z
主程序:
common a,b(3,2)
子程序:
common x(2,2),y(2,2)
无名公用区主程序,a b(1,1) b(2,1) b(3,1) b(1,2) b(2,2) b(3,2)
子程序,x(1,1) x(2,1) x(1,2) x(2,2) y(1,1) y(2,1) y(1,2) y(2,2)
§ 2 公用语句
21
2009-7-29
3.
4.
主程序:
common /c1/x(3) / /y(2)
子程序:
common a(2) /c1/b(3)
主程序:
common /t/x(2)/ /y/t/z(4)
子程序:
common g(2)/t/f(3,2)
无名公用区主程序,y(1) y(2)
子程序,a(1) a(2)
有名公用区 c1
无名公用区主程序,y
子程序,g(1) g(2)
有名公用区 t
§ 2 公用语句
x(1) x(2) x(3)
b(1) b(2) b(3)
x(1) x(2) z(1) z(2) z(3) z(4)
f(1,1) f(2,1)f(3,1)f(1,2)f(2,2)f(3,2)
22
2009-7-29
5,主程序:
common /s/q,r
common a(4) /s/p
子程序:
common /s/t(3) / /b(4)
无名公用区主程序,a(1) a(2) a(3) a(4)
子程序,b(1) b(2) b(3) b(4)
有名公用区 s
§ 2 公用语句
q r p
t(1) t(2) t(3)
23
2009-7-29
§ 3 数据块子程序 (p300)
数据块子程序是一种特殊的子程序,仅用于给有名公用区中的变量赋初值,更严格地讲,应该是指给 有名公用区中的存储单元 赋初值。
格式:
⑴ 子程序体中不允许出现可执行语句,只允许出现
data,common,dimension和变量类型定义语句,其中 data和 common语句是必不可少的 。
common语句说明公用区中各存储单元在数据块子程序中所对应的变量名; data语句用于赋初值。
block data 子程序名
end
子程序体
§ 2 公用语句
24
2009-7-29
block data init
integer x,y,z
dimension a(10),b(5)
common /com1/a,x,y,z
common /com2/b
data x,y,z/1,2,3/,b/5*100.0/
end
integer x1,y1,z1
common /com1/a1(10),x1,y1,z1
common /com2/b1(5),i
write(*,*)x1,y1,z1
write(*,*)b1
end
§ 3 数据块子程序
【 例 12.5】
25
2009-7-29
⑵ 数据块子程序仅用于给有名公用区中的存储单元赋初值,不需要被别的程序单元调用 ;程序在编译时,在给有名公用区分配存储空间之后,会自动执行数据块子程序进行赋初值。
⑶ 一个程序可以有多个数据块子程序,其中可以有一个数据块子程序没有子程序名 (称为无名数据块子程序 ),
即 一个程序只能有一个无名数据块子程序,可以有多个有名数据块子程序 。
⑷ 一个数据块子程序可以为多个有名公用区赋初值,
但一个有名公用区只能在一个数据块子程序中赋初值 。
§ 3 数据块子程序
26
2009-7-292007 12-4-Tuesday