Fortran之COMMON语句
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Fortran之COMMON语句
FORTRAN程序中各程序单位之间的数据交换可以通过虚实结合来实现,还可以通过建立公用区的方式来完成。公用区有两种,一种是无名公用区,任何一个程序中只可能有一个无名公用区;一种是有名公用区,一个程序中可以根据需要由程序员开辟任意多个有名公用区。建立无名和有名公用区都通过COMMON语句来进行。
按照结构化程序设计的指导思想,通常主张通过虚实结合的途径来传送数据而不主张使用公用区。因为前者使程序有较好的可读性,而且容易跟踪数据的流向,便于对程序进行调试和维护。但是虚实结合的传送方式速度较慢,特别是在各程序单位之间有大量的数据需要传送时速度问题就更为突出。不同程序单位利用公用区交换数据的速度却比虚实结合的方式传送速度快得多。所以在很多应用程序中如果各程序单位之间有大量数据需要传送时,程序员一般仍然采用开辟公用区的方式。
11.2.1 无名公用区
开辟无名公用区COMMON语句的一般形式如下:
COMMON a1,a2,…
其中a1,a2,…允许是普通变量名、数组名和数组说明符(注意:不是数组元素),它们之间用逗号隔开。例如:
在主程序中写:COMMON X,Y,I,Z(3)
在子程序中写:COMMON A,B,J,T(3)
于是,在无名公用区中变量X和A,Y和B,I和J分别分配在同一个存储单元中,数组Z和T同占三个存储单元。占同一个存储单元的那些变量在不同的程序单位中,它们的名字不需要相同。
FORTRAN编译程序在编译时为COMMON语句开辟一个无名公用区,当把不同的程序单位连接在一起的时候,不同程序单位在COMMON语句中的变量按其在语句中出现的先后顺序占用无名公用区连续的存储单元,也就是说每个程序单位中的COMMON语句总是给出现在语句中的第一个变量分配在无名公用区的第一个存储区单元。
COMMON语句开辟公用区的主要用途就是使不同程序单位的变量之间
进行数据传送,另一种用途是用来节省存储空间。下面的例子通过公用区进行交换数据:
PROGRAM MAIN
COMMON Z1,Z2
READ(*,*)A1,A2,A3
CALL QUAD(A1,A2,A3)
WRITE(*,*)Z1,Z2
END
SUBROUTINE QUAD(A,B,C)
COMMON X1,X2
.
.
.
END
或者:
PROGRAM MAIN
COMMON Z1,Z2,A1,A2,A3
READ(*,*)A1,A2,A3
CALL QUAD()
WRITE(*,*)Z1,Z2
END
SUBROUTINE QUAD()
COMMON X1,X2,A,B,C
.
.
.
END
建立无名公用区的规则:
(1)COMMON语句是说明语句,必须出现在所有可执行语句之前。COMMON 语句中只允许出现变量名、数组名和数组说明符,后者意味着可用COMMON语句说明数组,此数组必然放在公用区中。
(2)由于公用语句中的变量在编译时已被分配在实在的存储单元中,因此在公用语句中不能出现虚拟参数。同样,在编译时,可调数组的大小不定,无法分配固定的存储单元,因此可调数组名也不能出现在公用语句中。但是可调数组的维的上、下界变量可以通过COMMON语句传送,当然这些变量就不再允许出现在虚参表中。例如:
SUBROUTINE SUB(A,B)
COMMON NA,NB
DIMENSION A(NA),B(NB)
.
.
.
但是为了程序清晰起见,通常不提倡采用这种方式,而是希望通过虚实结合来传送与可调数组有关的全部量。
(3)一个程序在运行过程中只有一个无名公用区。在同一个程序单位中可以出现几个COMMON语句,它们的作用相当于一个。FORTRAN编译程序按COMMON语句在同一程序单位中出现的先后次序把语句中变量按顺序放在无名公用区的存储单元中。
(4)各程序单位COMMON语句中的变量类型必须按位置一一对应一致才能正确传送数据。例如:
主程序中有:
COMMON A(5),I
子程序中有:
COMMON B(4),I,P
主程序中A数组元素是实型,使数组元素A(5)和子程序中的整型变量I 共用存储单元,使主程序中的整型变量I和子程序中的实型变量P共用存储单元都是错误的。
(5)在一个程序单位中,分配在公用区中的名字只能在公用语句中出现一次。
(6)各程序单位中,无名公用区中的变量个数可以不一样。如:
主程序中有:
COMMON X(9),A,B,C,D
子程序中有:
COMMON A(4),X(2)
这是允许的。
(7)不要混淆EQUIVALENCE和COMMON语句,EQUIVALENCE语句是给同一程序单位中的不同变量分配同一个存储单元,而COMMON语句则用于给不同程序单位的变量分配同一存储单元。因此不允许在同一程序单位中写:
COMMON A,B,C
EQUIVALENCE(A,B)
因为COMMON语句把变量A、B、C分配在公用区的相邻的三个存储单元中,而EQUIVALENCE语句却又把A、B、C分配在同一个存储单元中,这是矛盾的,因
此禁止以上写法。
(8)公用区可以用EQUIVALENCE语句来扩大加长。例如:
EIMENSION A(4),B(4)
COMMON A,C
EQUIVALENCE(A(3),B(1))
公用语句在无名公用区开辟了连续的五个存储单元,等价语句使A(3)和B (1)共用存储单元因而把B数组带入了无名公用区,使公用区向后扩大了一个存储单元。这种情况下公用区的存储分配如下图:
A(1)
A(2)
A(3)
A(4)
C
B(1)
B(2)
B(3)
B(4)
公用区可以用这种方式加长。但是通过COMMON语句和EQUIVALENCE语句的联用,只允许公用区向后延伸,不允许向前延伸。对于上例,如果把EQUIVALENCE语句改为:EQUIVALENCE(A(1),B(2))则是非法的,它使得公用区出现下图所示的情况:
A(1)
A(2)