5

好吧,让我先说我为什么要这样做。我经常用 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++ 声明。

问题是,当我试图将一个向量(实际上是 a 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(:)在函数语句中声明一个向量(即:)作为返回数据类型?

4

2 回答 2

7

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

由函数子程序定义的函数结果的类型和类型参数(如果有)可以由 FUNCTION 语句中的类型说明或在说明部分的类型声明语句中出现的结果变量的名称来指定功能子程序。不应同时指定它们。如果它们都没有指定,它们由函数子程序中的隐式类型规则确定。如果函数结果是一个数组、可分配的或一个指针,这将由函数体内的结果变量名称的规范来指定。函数结果属性的规范、伪参数属性的规范和过程标题中的信息共同定义了函数的特征(12.3.1)。

于 2013-10-04T19:18:43.317 回答
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).

于 2013-10-04T15:06:12.797 回答