我的本地变量是否被覆盖为垃圾?

时间:2014-05-29 00:36:36

标签: fortran

如果我这样称呼我的功能:

t = calcMonth(month)

,相应的功能是

real function calcMonth(m)  
real b, m  
b = 10  
calcMonth = b*m

我的变量m是否被覆盖为垃圾值?

1 个答案:

答案 0 :(得分:0)

回复您的评论

  

我想通过在本地声明变量'm'来消除'm'的传递值

当你说(为清晰起见减少)

real function calcMonth(m)
  real m
end function

您没有在函数中声明局部变量m。相反,您要声明伪参数m的类型。实际上,执行此声明是声明伪参数的类型和属性的唯一合理方式。 [讨论超出本答复范围的理智。]

虽然重用局部变量的标识符可能会掩盖其他外部定义的对象,但不允许使用伪参数。

我非常害怕语言教程没有明确这些功能,但我会猜测为什么会有一些混乱。

可能是一个人

real function calcMonth(m)
  calcMonth = 10*m  ! Oh look, we are using the dummy m
end function

这与

非常不同
real function calcMonth(m)
  real m            ! Hmmm, a local m
  calcMonth = 10*m  ! Oh noes, which m am I using?
end function

这些可能有所不同,但唯一的区别是,在第一个m - 伪参数 - 正在隐式类型,在第二个m中仍然是伪参数 - 正在显式类型。 [使用默认的隐式类型规则m将是整数,因此这是之前提到的潜在差异。]

某些语言允许指定类型和属性(或等效的),如

real function calcMonth(integer m)

但Fortran不是其中之一。至关重要的是,伪论证的类型并非来自实际论证。

integer month
call calcMonth(month)
end

real function calcMonth(m)
  real m
  calcMonth = 10*m  ! Still the dummy m
end function

未声明局部变量m - 认为虚拟m先前已声明为整数,或者不知何故是实际参数{{1}因此,类型不匹配意味着它必须是一个新变量 - 并且最有可能在运行时发生不需要的事情。