Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fortran函数是否通过常量引用传递?_Fortran - Fatal编程技术网

fortran函数是否通过常量引用传递?

fortran函数是否通过常量引用传递?,fortran,Fortran,我正在学习如何在fortran中使用函数,我遇到了几个案例,这些案例使我相信fortran函数通过常量引用传递参数。当我说“通过const引用”时,我用C++的意义来表达。我在网上搜索,没有找到相关文件。下面的代码让我相信fortran函数通过常量引用传递参数 program try implicit none real sq real a,b write(*,*) sq(2) a=2 write(*,*) sq(a) end program real f

我正在学习如何在fortran中使用函数,我遇到了几个案例,这些案例使我相信fortran函数通过常量引用传递参数。当我说“通过const引用”时,我用C++的意义来表达。我在网上搜索,没有找到相关文件。下面的代码让我相信fortran函数通过常量引用传递参数

  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)
不起作用。在这个代码之后,我在
sq
的定义中添加了一个新行
x=x+1
。代码看起来像

  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。我在MacOSX10.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

我不知道为什么这个简单的修改会奏效。希望有人能为我澄清。

正如评论中指出的,您应该使用显式接口。然后编译器可以检查参数类型。这样做有不同的可能性。对于较大的程序使用模块,对于较小的程序,可以使用
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
有什么新鲜事吗

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

  • 关于推荐信,你是对的。在Fortran中,参数是通过引用传递的。如果您的参数不是一个变量,而是一个数字,那么您不能在过程中更改它,因为它是常量。如果希望通过值传递变量,请使用
    value
    关键字


  • 您首先应该指定常量引用的含义,因为它不是Fortran术语。在Fortran编程时不要用C++来思考。在Fortran,你只需传递一个变量,在某些条件下你就可以修改它。就这些。它通常是作为地址传递的,但您应该学习Fortran规则。学习使用显式接口(最好使用模块!),并始终指定
    intent
    。编译器将找到您显示的错误。确定。顺便说一句,
    VALUE
    参数也通过地址传递,如果不是
    bind(C)
    的话,所以不要太依赖细节。参数没有自动类型转换。如果你想通过实数考试,你必须通过实数考试(即使是正确的)。在这种情况下,编译器可能无法检查,在某些情况下也无法检查。