问题描述
作为 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:
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 属性的实体应为虚拟数据对象或虚拟过程指针.
回到编译器消息,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 变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!