使用COMMON而不在FORTRAN

时间:2016-07-21 05:28:04

标签: fortran

我正在浏览并分析传统的 FORTRAN 代码,我发现在一些使用 COMMON 的地方,并且使用的变量列表没有任何数据型

DIMENSION X(50),Y(50),VER(20),FCUR(20),H3(6),H4(6),G(6),TTAT(20),   
 XX(50),YY(50),EFFS(5),EFFI(5),PARA(6,9),ZZ(50)                      
  COMMON X,Y,PARA,TTAT,TTAT1,TTAT2,TTAT4,XQ,XL,WZ,     SA1,K7,        
 FVOL1,K1,K2,M5,RFIL,TNO,SAF,CFT,CFY,DSH                             
  COMMON     ACUL,AFMAX,AL,ALA,ALF,ALP,AKC,AKP,AMC,AS,AMP,AKE1,ATG,   
 AN1,AMPF,ALG,AKE,BC,BG,BA,BT,BAT,BTMAX,CUST1,CUST2,CUST3,CUST4,     
 CAP,CYCLE,CYCLL,CYCLH,CW,CH,   CAT,CAR,CMT,CMR,CAPL,CAPH,DATE1,     
 DATE2,DATE3,D1,DA,DB,DAMP,DY1,DBAR,D2L1,D2L2,DC,D4,DEND,ER,EX,

我已经看到这个变量X,Y,PARA,TTAT,TTAT1,TTAT2,TTAT4,XQ等用于计算,但没有为它们声明数据类型。

我假设这里实施了以下规则 名称以[I J K L M N]开头的Fortran变量是INTEGER,其他一切都是REAL。

SO也遵循相同的规则吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

完全。

您应该从每个例程中的IMPLICIT NONE开始,并明确定义变量。 INTENT也便于阅读进入和出入......

e.g:

 SUBROUTINE A(B, C, I, IO)
 USE My_Module_from_a_common
 IMPLICIT NONE
 DOUBLE, DIMENSION(:), INTENT(IN   ) :: B
 REAL,             , INTENT(INOUT) :: C
 INTEGER,          , INTENT(  OUT) :: I
 LOGICAL,          , INTENT(IN   ) :: IO

在现代代码中,编译了一个模块。 然后,USE语句就像模块的导入一样。

USE -module-实际上是/ common / block和INCLUDE'-file-'...的合并带来了一些额外的好处。 定义为PUBLIC的所有项都是全局的,而private是内部的。

e.g:

MODULE My_Module_From_a_Common
PUBLIC
REAL, DIMENSION(50), CONTIGUOUS :: X, Y, YY, ZZ
REAL, DIMENSION(6 ), CONTIGUOUS :: H3, H4
!etc     X(50),Y(50),VER(20),FCUR(20),H3(6),H4(6),G(6),TTAT(20),   
!etc    XX(50),YY(50),EFFS(5),EFFI(5),PARA(6,9),ZZ(50)                      
!etc  COMMON X,Y,PARA,TTAT,TTAT1,TTAT2,TTAT4,XQ,XL,WZ,     SA1,K7,        
!etc FVOL1,K1,K2,M5,RFIL,TNO,SAF,CFT,CFY,DSH                            
!etc  COMMON     ACUL,AFMAX,AL,ALA,ALF,ALP,AKC,AKP,AMC,AS,AMP,AKE1,ATG,   
!etc AN1,AMPF,ALG,AKE,BC,BG,BA,BT,BAT,BTMAX,CUST1,CUST2,CUST3,CUST4,     
!etc CAP,CYCLE,CYCLL,CYCLH,CW,CH,   CAT,CAR,CMT,CMR,CAPL,CAPH,DATE1,     
!etc DATE2,DATE3,D1,DA,DB,DAMP,DY1,DBAR,D2L1,D2L2,DC,D4,DEND,ER,EX,
END MODULE My_Module_From_a_Common

优点是如果您需要添加,更改或删除变量,则使用会使所有常见实例化相同。

当你编译-check all并-warn all时,或者-check uninit和-warn unused可能有助于解决问题......

在例程或函数中,保存由=某事物暗示......例如这些是相同的,否则下次没有保存结果。

REAL       :: A = 22.1
REAL, SAVE :: A

答案 1 :(得分:1)

是的,隐含规则有效。如果在include find中定义了一个公共块,那么最好定义所有变量的类型,因为你可以将它包含在具有不同隐式规则的过程中(包括implicit none)。包含文件中包含的公共块遵循包含它的子例程的规则。