还剩5页未读,继续阅读
文本内容:
Fortran之COMMON语句FORTRAN程序中各程序单位之间的数据交换可以通过虚实结合来实现,还可以通过建立公用区的方式来完成公用区有两种,一种是无名公用区,任何一个程序中只可能有一个无名公用区;一种是有名公用区,一个程序中可以根据需要由程序员开辟任意多个有名公用区建立无名和有名公用区都通过COMMON语句来进行按照结构化程序设计的指导思想,通常主张通过虚实结合的途径来传送数据而不主张使用公用区因为前者使程序有较好的可读性,而且容易跟踪数据的流向,便于对程序进行调试和维护但是虚实结合的传送方式速度较慢,特别是在各程序单位之间有大量的数据需要传送时速度问题就更为突出不同程序单位利用公用区交换数据的速度却比虚实结合的方式传送速度快得多所以在很多应用程序中如果各程序单位之间有大量数据需要传送时,程序员一般仍然采用开辟公用区的方式
11.
2.1无名公用区开辟无名公用区COMMON语句的一般形式如下COMMON al,a2,其中al,a2,…允许是普通变量名、数组名和数组说明符注意不是数组元素,它们之间用逗号隔开例如在主程序中写COMMON X,Y,I,Z3在子程序中写COMMON A,B,J,T3于是,在无名公用区中变量X和A,丫和B,I和J分别分配在同一个存储单元中,数组Z和T同占三个存储单元占同一个存储单元的那些变量在不同的程序单位中,它们的名字不需要相同FORTRAN编译程序在编译时为COMMON语句开辟一个无名公用区,当把不同的程序单位连接在一起的时候,不同程序单位在COMMON语句中的变量按其在语句中出现的先后顺序占用无名公用区连续的存储单元,也就是说每个程序单位中的COMMON语句总是给出现在语句中的第一个变量分配在无名公用区的第一个存储区单元COMMON语句开辟公用区的主要用途就是使不同程序单位的变量之间进行数据传送,另一种用途是用来节省存储空间下面的例子通过公用区进行交换数据PROGRAM MAINCOMMONZ1,Z2READ*,*A1,A2,A3CALL QUADAl,A2,A3WRITE*,*Z1,Z2ENDSUBROUTINE QUADA,B,CCOMMON XI,X2END或者PROGRAM MAINCOMMONZ1,Z2,Al,A2,A3READ%*A1,A
2.A3CALL QUADWRITE*,*Z1,Z2ENDSUBROUTINE QUADCOMMON XI,X2,A,B,CEND建立无名公用区的规则1COMMON语句是说明语句,必须出现在所有可执行语句之前o COMMON语句中只允许出现变量名、数组名和数组说明符,后者意味着可用COMMON语句说明数组,此数组必然放在公用区中2由于公用语句中的变量在编译时已被分配在实在的存储单元中,因此在公用语句中不能出现虚拟参数同样,在编译时,可调数组的大小不定,无法分配固定的存储单元,因此可调数组名也不能出现在公用语句中但是可调数组的维的上、下界变量可以通过COMMON语句传送,当然这些变量就不再允许出现在虚参表中例如SUBROUTINE SUBA,BCOMMON NA,NBDIMENSION ANA,BNB但是为了程序清晰起见,通常不提倡采用这种方式,而是希望通过虚实结合来传送与可调数组有关的全部量3一个程序在运行过程中只有一个无名公用区在同一个程序单位中可以出现几个COMMON语句,它们的作用相当于一个FORTRAN编译程序按COMMON语句在同一程序单位中出现的先后次序把语句中变量按顺序放在无名公用区的存储单元中4各程序单位COMMON语句中的变量类型必须按位置——对应一致才能正确传送数据例如主程序中有COMMON A5,I子程序中有COMMON B4,I,P主程序中A数组元素是实型,使数组元素A5和子程序中的整型变量I共用存储单元,使主程序中的整型变量I和子程序中的实型变量P共用存储单元都是错误的5在一个程序单位中,分配在公用区中的名字只能在公用语句中出现一次6各程序单位中,无名公用区中的变量个数可以不一样如主程序中有COMMONX9,A,B,C,D子程序中有COMMON A4,X2这是允许的7不要混淆EQUIVALENCE和COMMON语句,EQUIVALENCE语句是给同一程序单位中的不同变量分配同一个存储单元,而COMMON语句则用于给不同程序单位的变量分配同一存储单元因此不允许在同一程序单位中写COMMON A,B,CEQUIVALENCE A,B因为COMMON语句把变量A、B、C分配在公用区的相邻的三个存储单元中,而EQUIVALENCE语句却又把A、B、C分配在同一个存储单元中,这是矛盾的,因此禁止以上写法8公用区可以用EQUIVALENCE语句来扩大加长例如EIMENSION A4,B4COMMON A,CEQUIVALENCEA3,Bl公用语句在无名公用区开辟了连续的五个存储单元,等价语句使A3和B1共用存储单元因而把B数组带入了无名公用区,使公用区向后扩大了一个存储单元这种情况下公用区的存储分配如下图AlA2A3A4CBlB2B3B4公用区可以用这种方式加长但是通过COMMON语句和EQUIVALENCE语句的联用,只允许公用区向后延伸,不允许向前延伸对于上例,如果把EQUIVALENCE语句改为:EQUIVALENCE A1,B2则是非法的,它使得公用区出现下图所示的情况AlA⑵A3A4CBlB2B3B4B并没有在COMMON语句中说明,它是由等价语句带进来的,但B的元素向前越过了公用区的第一个存储单元,这是不允许的有名公用区COMMON语句说明有名公用区的形式如下COMMON/nl/al,a2,…/n2/bl,b2,…,…其中,nl,n2为公用区名,它们放在两个斜杠之间公用区名的取名方法与变量名同公用区名可以和本程序单位中的变量同名,但不允许和子程序同名al、a
2、…,bl、b
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,ZCOMMON语句中的公用区的变量可以“化整为零”,只要它们在有名公用区中的顺序不变,例如以上语句可写成COMMON R/C2/A//X,Y,Z/C2/B,C或者写成COMMON R/C2/ACOMMON/C2/B,//XCOMMON//Y,Z,/C2/C但是这种写法可读性差,建议把一个公用区用一条COMMON语句来完成,例如下面的语句使人一目了然COMMON R,X,Y,ZCOMMON/C2/A,B,C用无名公用区为各程序单位传送不同的变量时,必须使各个程序单位中的公用变量与单一的无名公用区中相应的变量进行对应,程序之间的数据传送显得僵化繁琐利用有名公用区避免了无名公用区的敝端,使之做到公用之中有“专用”,只需在各个程序单位中做到同名公用区中数据顺序一一对应就行了有名公用区的使用不仅保留了各程序单位之间数据的快速传送,也使程序得到了简化说明有名公用区的规则与说明无名公用区的规则基本相同,不同之处是1各程序单位的同名公用区中,变量不仅在类型上要一一对应一致,而且个数必须相同2如果有名公用区中出现字符型变量,则要求整个公用区中的变量都具有字符类型也就是不允许字符变量与其它变量放在同一个有名公用区中。
个人认证
优秀文档
获得点赞 0