Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 精度和全局变量类型的Fortran链接模块_Module_Fortran_Gfortran - Fatal编程技术网

Module 精度和全局变量类型的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

我是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显示了一个错误

通过上面的代码,我理解使用应该包含变量类型和参数;但是我从gfortran中得到的信息是,当我试图编译“module hon”时,我的变量都没有隐式类型

有人能澄清问题或提出解决方案吗?我希望避免将变量分散在多个模块中


谢谢

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

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

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

除此之外,你可能也有类似的担忧

要清楚,不可能说“所有被称为
kr
的函数结果和所有被称为
H
M
的伪参数都具有这些特征”。必须为每个单独的对象指定属性

但是,尽管我不建议这样做,但在这种情况下,文本包含(使用预处理器或包含文件)可以帮助您:

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

文件中有声明。

在函数语句中,
result(kr)
表示函数结果具有name
kr
。此函数结果与模块变量
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)
问题:您还需要适当地声明传递到函数中的内容。