Fortran 数组无法在函数中返回:不是 DUMMY 变量 [英] Fortran array cannot be returned in function: not a DUMMY variable
问题描述
作为 Fortran 90 自由格式的新手,我真的很想知道为什么以下代码片段不起作用:
Being new to Fortran 90 free-form, I would really like to know why the following piece of code snippet would not work:
program test2
implicit none
!!! A program to practice f90 writing.
! Define double precision data
integer, parameter :: dp = kind(1.d0)
real(dp) :: a(3), b(3)
integer :: i
a = (/(i, i=1, 3)/)
b = (/(i, i=1, 3)/)
write (*, *) m31tensorprod(a, b)
contains
function m31tensorprod(a, b)
real(dp), dimension(3), intent(in) :: a, b
real(dp), intent(out) :: m31tensorprod(3, 3)
integer :: k1, k2
forall(k1=1:3, k2=1:3)
m31tensorprod(k1, k2) = a(k1) * b(k2)
end forall
return
end function m31tensorprod
end program test2
当我尝试通过 gfortran test2.f90 编译它时,它说:
When I try to compile this via gfortran test2.f90, it says:
test2.f90:13.4:
test2.f90:13.4:
function m31tensorprod(a, b)
1 Error: Symbol at (1) is not a DUMMY variable
我想因为 m31tensorprod
是一个内部函数,它不应该被声明.我哪里做错了?
I thought because m31tensorprod
is an internal function, it shouldn't need to be declared. Where did I do wrong?
谢谢,
推荐答案
你是正确的,m31tensorprod
是一个内部函数意味着你不必在主程序中声明它.用行话来说:它有一个明确的接口.
You are correct that m31tensorprod
being an internal function means that you do not have to declare it in the main program. In the jargon: it has an explicit interface.
但是,这不是您的代码的问题.出了问题的是函数定义本身.[诚然,编译器消息并没有太大帮助.]
However, that is not the problem with your code. What is going wrong is with the function definition itself. [Admittedly the compiler message isn't too helpful.]
函数子程序的定义
function m31tensorprod(a, b)
用结果变量 m31tensorprod
定义一个函数.此结果变量取决于您的声明
defines a function with result variable m31tensorprod
. This result variable is subject to your declaration
real(dp), intent(out) :: m31tensorprod(3, 3)
正是这个声明不正确.您可以声明类型 (real(dp)
) 和维度 ((3,3)
),但 intent(out)
是错误的.
It is this declaration which is incorrect. You may declare type (real(dp)
) and dimension ((3,3)
) but the intent(out)
is erroneous.
intent
属性,用 Fortran 标准,受约束(C538)
The intent
attribute, in the words of the Fortran standard, is subject to the constraint (C538)
具有 INTENT 属性的实体应为虚拟数据对象或虚拟过程指针.
An entity with the INTENT attribute shall be a dummy data object or a dummy procedure pointer.
回到编译器消息,m31tensorprod
不是虚拟变量.在这种情况下,虚拟参数是 a
和 b
.一般来说,虚拟参数是 (
和 )
,
Coming back to the compiler message, m31tensorprod
is not a dummy variable. In this case the dummy arguments are a
and b
. In general the dummy arguments are those things between the (
and the )
,
这篇关于Fortran 数组无法在函数中返回:不是 DUMMY 变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!