在`function`语句中定义结果数据类型

时间:2013-10-04 14:44:59

标签: function fortran fortran90 intel-fortran variable-declaration

好吧,我先说一下我为什么要这样做。我经常用C / C ++编写代码,所以对我来说定义函数非常自然:

vector<int> TestFunct (int a, int b){
<some code here>

return <result>;}

现在我正在学习Fortran,所以我声明了这样的函数:

function TestFunc(a,b)
        integer, dimension(:)    :: TestFunc
        integer                  :: a
        integer                  :: b
        <some code here>
endfunction TestFunc

但是我最近了解到结果的数据类型可以在函数语句中定义,比如:<data_type> function TestFunc(a,b),这对我来说更自然,因为我习惯了类似的C ++声明。 / p>

问题是,当我'尝试定义一个向量(实际上是integer, dimension(:),严格说话)作为结果数据类型时,我有ifort错误#5082(我将在下一行详细说明。)

在一个例子中,对于代码:

real, dimension(:) function TestFunc(a,b)
         integer, intent(in)    :: a
         integer, intent(in)    :: b

         <more code here>

endfunction Testfunc

我得到了输出:

main.f90(23): error #5082: Syntax error, found ',' when expecting one of: ( * ) ( :: %FILL , TYPE INTEGER REAL COMPLEX BYTE CHARACTER CLASS DOUBLE ...
real, dimension(:) function TestFunc(a, b)
----^
main.f90(23): error #5082: Syntax error, found IDENTIFIER 'FUNCTION' when expecting one of: * :: , <END-OF-STATEMENT> ; [ / = => WITH
real, dimension(:,:) function TestFunc(a, b)
---------------------^

希望我已经清楚地解释了我的问题。

编辑:所以,为了总结我刚才在一个问题中所说的内容:我如何在函数语句中声明一个向量(即:integer, dimension(:))作为返回数据类型?

2 个答案:

答案 0 :(得分:7)

您可以在function符号之前定义返回类型,但它是有限的。这是一种较旧的方式,仅适用于较简单的情况。规则有点模糊,我不记得它们,但这是标准所说的:

函数子程序定义的函数结果的类型和类型参数(如果有)可能是 由FUNCTION语句中的类型规范或出现的结果变量的名称指定 在函数子程序的specication部分的类型声明语句中。它们不得具体说明 双向。如果它们没有以任何方式指定,则它们由内部的隐式类型规则决定 功能子程序。 如果函数结果是数组,可分配或指针,则应该指定 函数体中结果变量名称的规范。函数的规范 结果属性,伪参数属性的规范以及过程标题中的信息 共同定义函数的特征(12.3.1)。

答案 1 :(得分:1)

是的,你不能以这种方式定义任意形状的函数。您需要指定其长度,最简单的方法是将其长度作为额外参数发送:

function testFunc(n, a, b)
   integer, intent(in) :: n,a,b
   real, dimension(n) :: testFunc
   <...stuff...>
end function testFunc

或者,你可以做你想要的子程序:

subroutine testSub(a, b, F)
   integer, intent(in) :: a, b
   real, dimension(:), intent(inout) :: F
   <...stuff...>
end subroutine testSub

您可以通过call testSub(a, b, F)调用此内容。