我正在浏览并分析传统的 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也遵循相同的规则吗?
提前致谢
答案 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
)。包含文件中包含的公共块遵循包含它的子例程的规则。