Fortran之COMMON语句.docx

上传人:b****2 文档编号:1257352 上传时间:2022-10-19 格式:DOCX 页数:8 大小:19.07KB
下载 相关 举报
Fortran之COMMON语句.docx_第1页
第1页 / 共8页
Fortran之COMMON语句.docx_第2页
第2页 / 共8页
Fortran之COMMON语句.docx_第3页
第3页 / 共8页
Fortran之COMMON语句.docx_第4页
第4页 / 共8页
Fortran之COMMON语句.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

Fortran之COMMON语句.docx

《Fortran之COMMON语句.docx》由会员分享,可在线阅读,更多相关《Fortran之COMMON语句.docx(8页珍藏版)》请在冰豆网上搜索。

Fortran之COMMON语句.docx

Fortran之COMMON语句

FORTRAN程序中各程序单位之间的数据交换可以通过虚实结合来实现,还可以通过建立公用区的方式来完成。

公用区有两种,一种是无名公用区,任何一个程序中只可能有一个无名公用区;一种是有名公用区,一个程序中可以根据需要由程序员开辟任意多个有名公用区。

建立无名和有名公用区都通过COMMON语句来进行。

按照结构化程序设计的指导思想,通常主张通过虚实结合的途径来传送数据而不主张使用公用区。

因为前者使程序有较好的可读性,而且容易跟踪数据的流向,便于对程序进行调试和维护。

但是虚实结合的传送方式速度较慢,特别是在各程序单位之间有大量的数据需要传送时速度问题就更为突出。

不同程序单位利用公用区交换数据的速度却比虚实结合的方式传送速度快得多。

所以在很多应用程序中如果各程序单位之间有大量数据需要传送时,程序员一般仍然采用开辟公用区的方式。

11.2.1无名公用区

    开辟无名公用区COMMON语句的一般形式如下:

COMMONa1,a2,…

其中a1,a2,…允许是普通变量名、数组名和数组说明符(注意:

不是数组元素),它们之间用逗号隔开。

例如:

在主程序中写:

COMMONX,Y,I,Z(3)

在子程序中写:

COMMONA,B,J,T(3)

于是,在无名公用区中变量X和A,Y和B,I和J分别分配在同一个存储单元中,数组Z和T同占三个存储单元。

占同一个存储单元的那些变量在不同的程序单位中,它们的名字不需要相同。

    FORTRAN编译程序在编译时为COMMON语句开辟一个无名公用区,当把不同的程序单位连接在一起的时候,不同程序单位在COMMON语句中的变量按其在语句中出现的先后顺序占用无名公用区连续的存储单元,也就是说每个程序单位中的COMMON语句总是给出现在语句中的第一个变量分配在无名公用区的第一个存储区单元。

    COMMON语句开辟公用区的主要用途就是使不同程序单位的变量之间进行数据传送,另一种用途是用来节省存储空间。

下面的例子通过公用区进行交换数据:

PROGRAMMAIN

COMMONZ1,Z2

READ(*,*)A1,A2,A3

CALLQUAD(A1,A2,A3)

WRITE(*,*)Z1,Z2

END

SUBROUTINEQUAD(A,B,C)

COMMONX1,X2

        .

        .

      .

END

或者:

PROGRAMMAIN

COMMONZ1,Z2,A1,A2,A3

READ(*,*)A1,A2,A3

CALLQUAD()

WRITE(*,*)Z1,Z2

END

SUBROUTINEQUAD()

COMMONX1,X2,A,B,C

        .

        .

      .

END

    建立无名公用区的规则:

    

(1)COMMON语句是说明语句,必须出现在所有可执行语句之前。

COMMON语句中只允许出现变量名、数组名和数组说明符,后者意味着可用COMMON语句说明数组,此数组必然放在公用区中。

    

(2)由于公用语句中的变量在编译时已被分配在实在的存储单元中,因此在公用语句中不能出现虚拟参数。

同样,在编译时,可调数组的大小不定,无法分配固定的存储单元,因此可调数组名也不能出现在公用语句中。

但是可调数组的维的上、下界变量可以通过COMMON语句传送,当然这些变量就不再允许出现在虚参表中。

例如:

SUBROUTINESUB(A,B)

COMMONNA,NB

DIMENSIONA(NA),B(NB)

        .

        .

        .

但是为了程序清晰起见,通常不提倡采用这种方式,而是希望通过虚实结合来传送与可调数组有关的全部量。

    (3)一个程序在运行过程中只有一个无名公用区。

在同一个程序单位中可以出现几个COMMON语句,它们的作用相当于一个。

FORTRAN编译程序按COMMON语句在同一程序单位中出现的先后次序把语句中变量按顺序放在无名公用区的存储单元中。

    (4)各程序单位COMMON语句中的变量类型必须按位置一一对应一致才能正确传送数据。

例如:

主程序中有:

COMMONA(5),I

子程序中有:

COMMONB(4),I,P

主程序中A数组元素是实型,使数组元素A(5)和子程序中的整型变量I共用存储单元,使主程序中的整型变量I和子程序中的实型变量P共用存储单元都是错误的。

    (5)在一个程序单位中,分配在公用区中的名字只能在公用语句中出现一次。

    (6)各程序单位中,无名公用区中的变量个数可以不一样。

如:

主程序中有:

COMMONX(9),A,B,C,D

子程序中有:

COMMONA(4),X

(2)

这是允许的。

    (7)不要混淆EQUIVALENCE和COMMON语句,EQUIVALENCE语句是给同一程序单位中的不同变量分配同一个存储单元,而COMMON语句则用于给不同程序单位的变量分配同一存储单元。

因此不允许在同一程序单位中写:

COMMONA,B,C

EQUIVALENCE(A,B)

因为COMMON语句把变量A、B、C分配在公用区的相邻的三个存储单元中,而EQUIVALENCE语句却又把A、B、C分配在同一个存储单元中,这是矛盾的,因此禁止以上写法。

    (8)公用区可以用EQUIVALENCE语句来扩大加长。

例如:

EIMENSIONA(4),B(4)

COMMONA,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)

A(3)

A(4)

C

B

(1)

B

(2)

B(3)

B(4)

B并没有在COMMON语句中说明,它是由等价语句带进来的,但B的元素向前越过了公用区的第一个存储单元,这是不允许的。

11.2.2有名公用区

    COMMON语句说明有名公用区的形式如下:

COMMON/n1/a1,a2,…/n2/b1,b2,…,…

其中,n1,n2为公用区名,它们放在两个斜杠之间。

公用区名的取名方法与变量名同。

公用区名可以和本程序单位中的变量同名,但不允许和子程序同名。

a1、a2、…,b1、b2、…代表各公用区中的变量名、数组名或数组说明符。

也可以用两个连续的斜杠来表示无名公用区,例如:

COMMONR,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语句中的公用区的变量可以“化整为零”,只要它们在有名公用区中的顺序不变,例如以上语句可写成:

COMMONR/C2/A//X,Y,Z/C2/B,C

或者写成:

COMMONR/C2/A

COMMON/C2/B,//X

COMMON//Y,Z,/C2/C

    但是这种写法可读性差,建议把一个公用区用一条COMMON语句来完成,例如下面的语句使人一目了然。

COMMONR,X,Y,Z

COMMON/C2/A,B,C

    用无名公用区为各程序单位传送不同的变量时,必须使各个程序单位中的公用变量与单一的无名公用区中相应的变量进行对应,程序之间的数据传送显得僵化繁琐。

利用有名公用区避免了无名公用区的敝端,使之做到公用之中有“专用”,只需在各个程序单位中做到同名公用区中数据顺序一一对应就行了。

有名公用区的使用不仅保留了各程序单位之间数据的快速传送,也使程序得到了简化。

    说明有名公用区的规则与说明无名公用区的规则基本相同,不同之处是:

    

(1)各程序单位的同名公用区中,变量不仅在类型上要一一对应一致,而且个数必须相同。

    

(2)如果有名公用区中出现字符型变量,则要求整个公用区中的变量都具有字符类型。

也就是不允许字符变量与其它变量放在同一个有名公用区中。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1