【问题标题】:How to create functions in Fortran?如何在 Fortran 中创建函数?
【发布时间】:2018-02-06 12:23:00
【问题描述】:

我确信解决这个问题的方法非常基本,但我很难弄清楚如何在 Fortran 中使用函数。我有以下简单的程序:

  PROGRAM main
    IMPLICIT NONE
    INTEGER :: a,b
    a = 3
    b = 5
    PRINT *,funct(a,b)
  END PROGRAM

  FUNCTION funct(a,b)
    IMPLICIT NONE
    INTEGER :: funct
    INTEGER :: a,b

    funct = a + b
  END FUNCTION

我已经尝试了几种变体,包括在 FUNCTION 之前分配数据类型,将 funct 的结果分配给主程序中的另一个变量并打印该变量,以及将 FUNCTION 块移动到 PROGRAM 块上方。这些都不起作用。使用当前程序,我在第 6 行(带有 PRINT 语句的行)出现错误:

Error: Return type mismatch of function 'funct' (UNKNOWN/INTEGER(4))
Error: Function 'funct' has no IMPLICIT type

从我尝试过的所有指南来看,我似乎做得对;至少其中一种变体,或其中一些变体的组合应该有效。我需要如何更改此代码才能使用该功能?

【问题讨论】:

  • 问题是你使用了implicit none,而你没有给funct一个声明。您必须添加integer ,external :: funct
  • 谢谢,这和皮埃尔的回答都有效。

标签: fortran gfortran


【解决方案1】:

仅仅将函数放在文件中不会使主程序可以访问它。

传统上,您可以简单地将函数声明为external,编译器只希望在编译时找到合适的声明。

现代 Fortran 将代码和数据组织在“模块”中。但是,出于您的目的,将函数“包含”在主程序范围内会更简单,如下所示:

PROGRAM main
  IMPLICIT NONE
  INTEGER :: a,b
  a = 3
  b = 5
  PRINT *,funct(a,b)

CONTAINS

  FUNCTION funct(a,b)
    IMPLICIT NONE
    INTEGER :: funct
    INTEGER :: a,b

    funct = a + b
  END FUNCTION funct
END PROGRAM main

【讨论】:

    【解决方案2】:

    更简单的解决方案可以是下面的代码

     PROGRAM main
        IMPLICIT NONE
        INTEGER :: a,b, funct
        a = 3
        b = 5
        PRINT *,funct(a,b)
      END PROGRAM
    
      FUNCTION funct(a,b)
        IMPLICIT NONE
        INTEGER :: funct
        INTEGER :: a,b
    
        funct = a + b
      END FUNCTION
    

    唯一的区别在于第三行,我将funct 声明为integer。它编译并打印8作为结果。

    【讨论】:

    • 您(正确地)将funct 的返回类型声明为 integer 不真实。不过,在一般情况下,这是一个非常糟糕的建议。
    • 非常感谢,我是 Fortran 新手。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 2015-02-27
    • 1970-01-01
    相关资源
    最近更新 更多