如果我这样称呼我的功能:
t = calcMonth(month)
,相应的功能是
real function calcMonth(m)
real b, m
b = 10
calcMonth = b*m
我的变量m
是否被覆盖为垃圾值?
答案 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}因此,类型不匹配意味着它必须是一个新变量 - 并且最有可能在运行时发生不需要的事情。