2016-07-21 5 views
0

で変数を宣言することなく、私が通過してレガシーFORTRANコードを分析し、私はCOMMONが使用され、使用される変数のリストは任意のデータ型使用はFORTRAN

を持っていない場所のいくつかで見ています
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も同様のルールに従っていますか?

ありがとうございます。

答えて

1

正確に。

おそらく、各ルーチンでIMPLICIT NONEで開始し、変数を明示的に定義する必要があります。 INTENTも

例えば:近代的なコードで

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 

...-に行くと来る-outtaの読みやすさになり、モジュールがコンパイルされます。 USE文はモジュールのインポートに似ています。

USEモジュールは効果的に/ common/blockとINCLUDE '-file -.....のマージであり、いくつかの追加の利点があります。 PUBLICとして定義されたすべての項目はグローバルであり、プライベートは内部です。

例えば:

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 

利点は、追加、変更、または変数を削除する必要がある場合は使用はすべて共通のインスタンスが同じになるということです。保存ルーチンまたは関数では、すべてのと-warnすべて、または-check UNINITと-warn未使用のものを働かせて参考にすることができ-checkコンパイル

...

は=何かによって暗示ます。..例えばこれらは同じです。それ以外の場合は、次回に結果が保存されません。

REAL  :: A = 22.1 
REAL, SAVE :: A 
+2

お願い、私はあなたに頼んだ。ハイテクの人々の良い実践に「kind = 4」を導入しないでください。それは悪い習慣です。本当に悪い。しないでください。私はおそらく将来それを下降させるでしょう。しばらくお待ちください... –

+2

これはあまり重要ではありません。この場合、連続したものは表面的であり、許可されていても効果がありません。それはポインタと仮定された形状仮引数のためのものです。 –

+0

Vladimirありがとう - なぜKIND =悪いですか?それとも、リアルとダブルをお勧めしますか?またはC_INT、C_LONGのようなr_c_interoperabilityのものを使用していますか? – Holmz

1

はい、暗黙のルールが有効です。共通のブロックがインクルード・ファインドで定義されている場合、すべての変数のタイプを定義するほうが、異なる暗黙のルール(implicit noneを含む)を持つプロシージャーに含めることができるので、本当に良いタイプです。インクルードファイルからインクルードされる共通ブロックは、それを含むサブルーチンの規則に従います。