Fortran 是否通过函数和子程序调用保留内部变量的值? [英] Does Fortran preserve the value of internal variables through function and subroutine calls?

查看:19
本文介绍了Fortran 是否通过函数和子程序调用保留内部变量的值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

经过多次痛苦的调试,我相信我已经找到了 Fortran 的一个独特属性,我想在 stackoverflow 上验证它.

After much painful debugging, I believe I've found a unique property of Fortran that I'd like to verify here at stackoverflow.

我一直注意到的是,至少,内部逻辑变量的值在函数或子例程调用中得以保留.

What I've been noticing is that, at the very least, the value of internal logical variables are preserved across function or subroutine calls.

下面是一些示例代码来说明我的观点:

Here is some example code to illustrate my point:

PROGRAM function_variable_preserve
IMPLICIT NONE

CHARACTER(len=8) :: func_negative_or_not ! Declares function name
INTEGER :: input
CHARACTER(len=8) :: output

input = -9

output = func_negative_or_not(input)
WRITE(*,10) input, " is ", output
10 FORMAT("FUNCTION: ", I2, 2A)

CALL sub_negative_or_not(input, output)
WRITE(*,20) input, " is ", output
20 FORMAT("SUBROUTINE: ", I2, 2A)

WRITE(*,*) 'Expected negative.'


input = 7
output = func_negative_or_not(output)
WRITE(*,10) input, " is ", output

CALL sub_negative_or_not(input, output)
WRITE(*,20) input, " is ", output

WRITE(*,*) 'Expected positive.'

END PROGRAM function_variable_preserve

CHARACTER(len=*) FUNCTION func_negative_or_not(input)
IMPLICIT NONE

INTEGER, INTENT(IN) :: input
LOGICAL :: negative = .FALSE.

IF (input < 0) THEN
    negative = .TRUE.
END IF

IF (negative) THEN
    func_negative_or_not = 'negative'
ELSE 
    func_negative_or_not = 'positive'
END IF

END FUNCTION func_negative_or_not

SUBROUTINE sub_negative_or_not(input, output)
IMPLICIT NONE

INTEGER, INTENT(IN) :: input
CHARACTER(len=*), INTENT(OUT) :: output
LOGICAL :: negative = .FALSE.

IF (input < 0) THEN
    negative = .TRUE.
END IF

IF (negative) THEN
    output = 'negative'
ELSE 
    output = 'positive'
END IF

END SUBROUTINE sub_negative_or_not

这是输出:

FUNCTION: -9 is negative
SUBROUTINE: -9 is negative
 Expected negative.
FUNCTION:  7 is negative
SUBROUTINE:  7 is negative
 Expected positive.

如您所见,一旦函数或子例程被调用一次,逻辑变量negative,如果切换到.TRUE.,就会保持原样,尽管类型声明语句中将negative初始化为.FALSE..

As you can see, it appears that once the function or subroutine is called once, the logical variable negative, if switched to .TRUE., remains as such despite the initialization of negative to .FALSE. in the type declaration statement.

我当然可以通过添加一行来纠正这个问题负 = .FALSE.在我的函数和子程序中声明变量之后.

I could, of course, correct this problem by just adding a line negative = .FALSE. after declaring the variable in my function and subroutine.

然而,我觉得这是必要的,这很奇怪.

However, it seems very odd to me that this be necessary.

为了可移植性和代码可重用性,每次调用子例程或函数时,语言(或编译器)不应该要求重新初始化所有内部变量吗?

推荐答案

回答您的问题:是的,Fortran 确实通过函数和子例程调用保留了内部变量的值.

在一定条件下...

如果您使用 SAVE 属性声明一个内部变量,它的值会从一次调用保存到下一次调用.当然,这在某些情况下很有用.

If you declare an internal variable with the SAVE attribute it's value is saved from one call to the next. This is, of course, useful in some cases.

但是,您的问题是第一次了解 Fortran 的一个陷阱时的常见反应:如果您在其声明中初始化一个内部变量,那么它会自动获取 SAVE 属性.你已经在你的子程序中做到了这一点.这是符合标准的.如果您不希望这种情况发生,请不要在声明中进行初始化.

However, your question is a common reaction upon first learning about one of Fortran's gotchas: if you initialise an internal variable in its declaration then it automatically acquires the SAVE attribute. You have done exactly that in your subroutines. This is standard-conforming. If you don't want this to happen don't initialise in the declaration.

这是该语言(一些)新手感到惊讶和抱怨的原因.但无论他们如何抱怨都不会改变,所以您只需要 (a) 了解它并 (b) 编程时意识到它.

This is the cause of much surprise and complaint from (some) newcomers to the language. But no matter how hard they complain it's not going to change so you just have to (a) know about it and (b) program in awareness of it.

这篇关于Fortran 是否通过函数和子程序调用保留内部变量的值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆