【问题标题】:Declaring variables in function (Fortran)在函数中声明变量 (Fortran)
【发布时间】:2026-02-11 17:10:02
【问题描述】:

我正在尝试用 Fortran 编写一个非常简单的函数(第一次使用):

program Main 
  implicit none 
  integer function k(n) 
    integer, intent(in) :: n 
    k=n 
   end function k 
 end program Main

我收到一堆错误:

integer function k(n)
                  1
Error: Syntax error in data declaration at (1)

   integer, intent(in) :: n
                          1
Error: Unexpected data declaration statement at (1)

   end function k
     1
Error: Expecting END PROGRAM statement at (1)

   k=n
   1
Error: Symbol ‘k’ at (1) has no IMPLICIT type

   k=n
     1
Error: Symbol ‘n’ at (1) has no IMPLICIT type

我做错了什么?我正在使用最新版本的 gfortran。

【问题讨论】:

  • 您能否提供一些有关您如何编译以及您正在使用的编译器的确切版本(最新可能意味着很多不同的东西)等的详细信息?我猜你需要gfortran -c file.f90 而不是gfortran file.f90 或者你应该提供minimal reproducible example
  • 我正在使用 gfortran file.f90。我现在也尝试添加-c,但没有用。我的编译器是 gfortran 6.1。埃尔卡皮坦。
  • 您的文件是否仅包含您在问题中所写的内容,或者还有更多内容?如果还有更多内容,您可以提供(或最小版本),因为我可以毫无问题地编译上述内容。
  • 这就是:程序 Main 隐式无整数函数 k(n) 整数,intent(in) :: n k=n end function k end program Main

标签: fortran gfortran


【解决方案1】:

例如,程序块本地的任何声明函数和子例程都应放在contains 语句之后

program Main 
  implicit none 
 contains
  integer function k(n) 
    integer, intent(in) :: n 
    k=n 
   end function k 
end program Main

举一个使用这个的程序的例子,你可以有

program Main 
  implicit none 
  integer :: myLocalN
  myLocalN = 2
  print*, "My local N is ", myLocalN
  print*, "The value of this squared is", sq(myLocalN)
 contains
  integer function sq(n) 
    integer, intent(in) :: n 
    sq=n*n 
   end function sq
end program Main

【讨论】:

  • 谢谢!现在如果我想打印,比如说,k(3),我该怎么做?我尝试在结束函数 k 之后添加 print *, k(3) 语句,但出现错误:Unexpected WRITE statement in CONTAINS section at (1)
  • @odnerpmocon 我已经编辑了我的答案以包含一个示例。基本上你的主程序语句应该在contains 块之前。