好吧,我先说一下我为什么要这样做。我经常用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(:)
)作为返回数据类型?
答案 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)
调用此内容。