用于精度和全局变量类型的Fortran链接模块

时间:2017-09-19 09:15:44

标签: module fortran gfortran

我是Fortran的新手并试图了解以下是否可行。我构建程序的想法是在一个模块中声明精度和变量类型。然后使用这些变量而不再声明其他模块或主程序中的类型。

module pre
implicit none

    INTEGER, PARAMETER      ::  sp=SELECTED_REAL_KIND(6,37)
    INTEGER, PARAMETER      ::  dp=SELECTED_REAL_KIND(15,307)
    INTEGER, PARAMETER      ::  qp=SELECTED_REAL_KIND(33,4931)

    REAL(dp), PARAMETER     ::  pi = 4.*ATAN(1.)
    REAL(dp)                ::  H                              
    REAL(dp)                ::  M 
    REAL(dp)                ::  KR 

end module pre

现在我想利用包含一个或多个函数的另一个模块中的所有变量,例如:

module hon
use pre
implicit none

contains
    function KE(H,M) result(KR)
        KR = 2*PI/H/M
    end function KE
end module hon

然后我按顺序使用gfortran:

gfortran -c mod_pre.f90
gfortran -c mod_hon.f90

由于'module pre'是'module hon'的一部分,我按顺序编译,但gfortran显示错误。

根据上面的代码,我了解变量类型和参数应该包含在 USE ;但是我从 gfortran 得到的消息是,当我尝试编译'module hon'时,我的变量都没有IMPLICIT类型。

有人可以澄清问题或建议解决方案吗?我想避免让我的变量分散在多个模块中。

谢谢!

1 个答案:

答案 0 :(得分:0)

在函数语句中,result(kr)表示函数结果的名称为kr。此函数结果与模块变量kr不同。特别是,此函数结果使模块变量无法访问。

函数结果特定于函数本身,其属性必须在函数子程序中声明。

类似地,函数HM的伪参数与模块变量不同,需要在函数子程序中声明。

除此之外,您可能对此other question也有类似的担忧。

要明确的是,不可能说“所有函数结果称为kr”,所有称为HM的虚拟参数都具有这些特征“。必须为每个单独的对象提供属性。

但是,虽然我不建议这样做,但是文字文本包含(使用预处理程序或包含文件)可以帮助您:

function ke(H, M) result (kr)
   include 'resdummydecls'
   ...
end function

文件中有声明。