Fortran 数组无法在函数中返回:不是 DUMMY 变量 [英] Fortran array cannot be returned in function: not a DUMMY variable

查看:49
本文介绍了Fortran 数组无法在函数中返回:不是 DUMMY 变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

作为 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 不是虚拟变量.在这种情况下,虚拟参数是 ab.一般来说,虚拟参数是 (),

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆