考虑这个简单的程序:
program foo
integer bar,idum
print * , bar(1)
end program
function bar(idum)
integer idum,bar
print * , idum
idum = 2
bar = 2
return
end
当我运行它时,我在行idum = 2
Starting program: /tmp/a.out
1
Program received signal SIGSEGV, Segmentation fault.
0x000000000040081b in bar (idum=1) at play.f:11
11 idum = 2
我不允许为传递给函数的变量赋值吗?我如何将它们用作旗帜?
答案 0 :(得分:3)
您将文字值1
传递给该函数。然后你尝试在
idum = 2
这是不允许的。代码尝试更改文字常量并崩溃,因为这是不可能的。
如果要更改函数内的值,则a)它必须是变量,而不是常量值,b)必须按值传递(Fortran 2003)。
在现代Fortran 始终中使用显式接口。我的意思是总是。要么使用模块(首选!!!),要么在简单的情况下使用内部函数,如:
program foo
integer bar,idum
print * , bar(1)
contains
function bar(idum)
integer idum,bar
print * , idum
idum = 2
bar = 2
return
end function
end program
编译器可能会告诉你你做错了。特别是,如果为参数指定intent
:
function bar(idum)
integer bar
integer, intent(in) :: idum
编译器将现在抱怨。它也会抱怨其他意图。然后,您可以修复代码以使编译器满意。
始终!!!!! 使用IMPLICIT NONE
。这不是可选的。这是必要的。