fortran函数是否通过const引用?

时间:2014-12-12 21:44:42

标签: fortran

我正在学习如何在fortran中使用函数,我遇到了几个让我相信fortran函数通过const引用传递参数的情况。当我说“通过const引用”时,我在C ++意义上说它。我在网上搜索并没有找到相关文件。让我相信fortran函数通过const引用传递参数的代码如下。

  program try
  implicit none
  real sq
  real a,b
  write(*,*) sq(2)
  a=2
  write(*,*) sq(a)
  end program


  real function sq(x)
  real x
  sq=x**2
  return
  end

此输出为

  0.0000000E+00
  4.000000

这个结果支持fortran函数通过引用传递参数的想法,因为sq(2)不起作用。在此代码之后,我在x=x+1的定义中添加了一个新行sq。代码看起来像

  program try
  implicit none
  real sq
  real a,b
  write(*,*) sq(2)
  a=2
  write(*,*) sq(a)
  end program


  real function sq(x)
  real x
  x=x+1
  sq=x**2
  return
  end

此代码编译,但是当我运行它时,它会出现以下错误

forrtl: severe (180): SIGBUS, bus error occurred
Image              PC                Routine            Line           Source             
a.out              00000001000014DB  Unknown               Unknown  Unknown
a.out              000000010000144C  Unknown               Unknown  Unknown

Stack trace terminated abnormally.

我想我得到了这个错误,因为我无法修改函数定义中的参数,这让我相信参数是由const引用传递的。我正在使用的编译器是ifort 12.0.0。我在Mac OS X 10.6.8上运行它。谁能告诉我我的猜测是否属实?

更新:根据@Jean的评论,将sq(2)修改为sq(2.0)后。第一个例子可以工作,第二个例子仍然会给出相同的错误。第一个例子的修改版本是

  program try
  implicit none
  real sq
  real a,b
  write(*,*) sq(2.0)
  a=2
  write(*,*) sq(a)
  end program


  real function sq(x)
  real x
  sq=x**2
  return
  end

输出

4.000000
4.000000

我不知道为什么这个简单的修改会起作用。希望有人可以为我澄清。

1 个答案:

答案 0 :(得分:1)

正如评论中指出的那样,您应该使用显式接口。然后编译器能够检查参数类型。这样做有不同的可能性。对于较大的程序使用模块,对于较小的程序,您可以使用contains关键字在主程序中包含您的程序。

以下是您的代码的略微修改版本:

program try
    implicit none
    real a,b
    write(*,*) sq(2.0)
    a=2
    write(*,*) sq(a)

contains

real function sq(x)
    real, value :: x
    x=x+1
    sq=x**2
    return
end

end program

什么是新的?

  1. 该功能包含在主程序中,并带有contains关键字。这样做时,您不必像在第三行中那样声明sq。此外,编译器现在可以检查参数类型。尝试编写2而不是2.0,看看会发生什么。

  2. 你对参考文献是正确的。在Fortran中,参数通过引用传递。如果您的参数不是变量而只是一个数字,那么您无法在过程中更改它,因为它是常量。如果您希望按值传递变量,请使用value关键字。