fortran调用 带有参数 且 返回类型为数组的函数 及 相关歧义分析

Posted 新来的大狮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fortran调用 带有参数 且 返回类型为数组的函数 及 相关歧义分析相关的知识,希望对你有一定的参考价值。

fortran调用 带有参数 且 返回类型为数组的函数 及 相关歧义分析

1 参考书籍

Fortran95程序设计【彭国伦】 - P189 函数的使用接口

2 fortran环境

Visual Studio 2019(community) + XE2020

3 主要思路

① 定义好待调用的函数(function)

② 编写测试主程序调用该函数

③ 注意 在主程序中使用 被调用的函数 进行声明时, 需要使用interface关键字声明该调用函数

④ 验证结果

4 具体实现代码

4.1 项目结构

项目类型 - Empty Project
(一个fortran控制台程序,示例为FortranEx3项目)

文件结构 - 涉及两个文件
① 主程序文件 main.f90
② 函数外部文件 Source2.f90

4.2 主程序文件(入口文件)

main.f90

program test3
    implicit none
    
    !测试调用带有参数的返回类型为数组的函数,需要使用interface关键字
    interface
        function array_test(num)
        double precision,dimension(10) :: array_test
        double precision :: num
        end function
    end interface
        
    
    double precision value
    value = 9.6
    
    print * , array_test(value)

    
    end program

4.3 外部定义的函数文件

Source2.f90

!传入一个实数并对整个数组赋值后返回
function array_test(num)
    double precision,dimension(10) :: array_test
    double precision :: num
    integer count
    do count=1,10
        array_test(count) = num
    end do
    return
end function

4.4 测试结果

成功调用 带有参数的 且 返回值为 数组的 函数 array_test

5 相关歧义分析

5.1 分析

若在测试程序中(main.f90) 在函数声明时, 不使用 interface 关键字进行相关声明,会导致未调用该函数。

即: 调用函数的代码 会变成 对该函数返回的数组的 某个具体元素的简单调用

原因:

在fortran90语法中,对数组元素的调用为 使用数组名加小括号,如:array_test(1),调用array_test数组的第一个元素。

在Source2.f90程序中,由于此时 函数名array_test被声明为一个数组类型,该函数名fortran90语法既可做 被调用的函数名,又可作返回的数组名

array_test(value)

此段 调用函数的代码,在fortran中

① 既可以指 传入value做参数 并调用该函数, 此时作 函数名

② 又可以指调用该数组的第value个索引的元素, 此时作 数组名

5.2 错误演示代码

main.f90

program test3
    implicit none
    
    !测试调用带有参数的返回类型为数组的函数,需要使用interface关键字
    !interface
    !    function array_test(num)
    !    double precision,dimension(10) :: array_test
    !    double precision :: num
    !    end function
    !end interface
    
    !为方便观察结果而赋予的初值
    double precision,dimension(10) :: array_test = (/0, 1, 2, 3, 4, 5, 6, 7, 8, 9/)
    
    double precision value
    value = 9.6
    
    print * , array_test(9)
    print * , array_test(value)

    
    end program

Source2.f90 代码保持不变

5.3 错误执行结果


由于array_test被当做 数组名使用,此时value=9.6,

array_test(value)变成简单的调用array_test数组第9个索引的值

而实际的array_test(value)未被当做函数使用

即:未发生为数组每个元素赋值为9.6的过程,最终输出类似 array_test[9] 的效果,返回元素值8。

注:fortran数组下标从1开始。

以上是关于fortran调用 带有参数 且 返回类型为数组的函数 及 相关歧义分析的主要内容,如果未能解决你的问题,请参考以下文章

fortran调用 带有参数 且 返回类型为数组的函数 及 相关歧义分析

FORTRAN自定义函数返回值

从 C++ 调用带有可选参数的 Fortran 子例程

从 C++ 调用带有可选参数的 Fortran 子例程

带有参数列表的Fortran类型定义

在 C++ 和 Fortran 代码之间传递复数数组