Module 精度和全局变量类型的Fortran链接模块
我是Fortran新手,正在尝试理解以下内容是否可行。我构建程序的想法是在一个模块中声明精度和变量类型。然后使用这些变量,而无需在其他模块或主程序中再次声明类型Module 精度和全局变量类型的Fortran链接模块,module,fortran,gfortran,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, PARAMETE
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显示了一个错误
通过上面的代码,我理解使用应该包含变量类型和参数;但是我从gfortran中得到的信息是,当我试图编译“module hon”时,我的变量都没有隐式类型
有人能澄清问题或提出解决方案吗?我希望避免将变量分散在多个模块中
谢谢 在函数语句中,
result(kr)
表示函数结果具有名称kr
。此函数结果与模块变量kr
不同。特别是,此函数结果使模块变量无法访问
函数结果特定于函数本身,其属性必须在函数子程序中声明
类似地,函数的伪参数H
和M
与模块变量不同,需要在函数子程序中声明
除此之外,你可能也有类似的担忧
要清楚,不可能说“所有被称为kr
的函数结果和所有被称为H
或M
的伪参数都具有这些特征”。必须为每个单独的对象指定属性
但是,尽管我不建议这样做,但在这种情况下,文本包含(使用预处理器或包含文件)可以帮助您:
function ke(H, M) result (kr)
include 'resdummydecls'
...
end function
文件中有声明。在函数语句中,
result(kr)
表示函数结果具有namekr
。此函数结果与模块变量kr
不同。特别是,此函数结果使模块变量无法访问
函数结果特定于函数本身,其属性必须在函数子程序中声明
类似地,函数的伪参数H
和M
与模块变量不同,需要在函数子程序中声明
除此之外,你可能也有类似的担忧
要清楚,不可能说“所有被称为kr
的函数结果和所有被称为H
或M
的伪参数都具有这些特征”。必须为每个单独的对象指定属性
但是,尽管我不建议这样做,但在这种情况下,文本包含(使用预处理器或包含文件)可以帮助您:
function ke(H, M) result (kr)
include 'resdummydecls'
...
end function
文件上有声明的地方。你好,弗朗西斯卡勒斯,请耐心听我说。那么声明变量类型并将该模块用于其他模块就没有用了?例如,结果“kr”将始终是一个实数(dp)以及其余的输入变量。这意味着我需要在每个模块中声明“H”或任何其他,而不是只定义一次?在您的示例中,sp、dp和qp可以按如下方式使用:
real(kind=dp)::ke
来定义函数种类。@francescalus提到的变量kr
,被重新定义为局部变量。如果未定义本地kr
,则将使用模块范围的kr
。您好,感谢您的回答,我已经研究了解决方案,找到的唯一方法是重新定义函数内的变量。我现在面临另一个关于函数的问题,因为gfortran声明我正在将变量REAL(4)传递给REAL(8)。我发现开始有点挑战性。有没有办法克服这个问题?是的,@musi,你必须定义(而不是重新定义)函数中的变量:它们只存在于函数的上下文中。(技术上说是“声明”,而不是“定义”。)。关于real(4)
和real(8)
问题:您还需要适当声明传递到函数中的内容。你好,francescalus,请耐心听我说。那么声明变量类型并将该模块用于其他模块就没有用了?例如,结果“kr”将始终是一个实数(dp)以及其余的输入变量。这意味着我需要在每个模块中声明“H”或任何其他,而不是只定义一次?在您的示例中,sp、dp和qp可以按如下方式使用:real(kind=dp)::ke
来定义函数种类。@francescalus提到的变量kr
,被重新定义为局部变量。如果未定义本地kr
,则将使用模块范围的kr
。您好,感谢您的回答,我已经研究了解决方案,找到的唯一方法是重新定义函数内的变量。我现在面临另一个关于函数的问题,因为gfortran声明我正在将变量REAL(4)传递给REAL(8)。我发现开始有点挑战性。有没有办法克服这个问题?是的,@musi,你必须定义(而不是重新定义)函数中的变量:它们只存在于函数的上下文中。(技术上说是“声明”,而不是“定义”。)。关于real(4)
和real(8)
问题:您还需要适当地声明传递到函数中的内容。