我正在学习如何在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
我不知道为什么这个简单的修改会起作用。希望有人可以为我澄清。
答案 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
什么是新的?
该功能包含在主程序中,并带有contains
关键字。这样做时,您不必像在第三行中那样声明sq。此外,编译器现在可以检查参数类型。尝试编写2
而不是2.0
,看看会发生什么。
你对参考文献是正确的。在Fortran中,参数通过引用传递。如果您的参数不是变量而只是一个数字,那么您无法在过程中更改它,因为它是常量。如果您希望按值传递变量,请使用value
关键字。