fortran函数是否通过常量引用传递?
我正在学习如何在fortran中使用函数,我遇到了几个案例,这些案例使我相信fortran函数通过常量引用传递参数。当我说“通过const引用”时,我用C++的意义来表达。我在网上搜索,没有找到相关文件。下面的代码让我相信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
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
,看看会发生什么
value
关键字您首先应该指定常量引用的含义,因为它不是Fortran术语。在Fortran编程时不要用C++来思考。在Fortran,你只需传递一个变量,在某些条件下你就可以修改它。就这些。它通常是作为地址传递的,但您应该学习Fortran规则。学习使用显式接口(最好使用模块!),并始终指定
intent
。编译器将找到您显示的错误。确定。顺便说一句,VALUE
参数也通过地址传递,如果不是bind(C)
的话,所以不要太依赖细节。参数没有自动类型转换。如果你想通过实数考试,你必须通过实数考试(即使是正确的)。在这种情况下,编译器可能无法检查,在某些情况下也无法检查。