0

如何从函数调用中全球化虚拟参数?

我在 Fortran 中有以下代码

A(a,b)  // here a and b are the values filling from function call but they are not declared any where
.
.
.
B(a.b) // same variable passing again to this function call also.

这里的问题是来自ab的值在第二次调用时没有保持。它正在返回垃圾。即使我尝试使用common但它不接受全球化虚拟参数。怎么做?

4

3 回答 3

1

你说“a并且b是函数调用填充的值,但它们没有在任何地方声明” - 即使我仍在试图弄清楚你想要做什么,这个声明会引发各种危险信号。这是 Fortran - 你需要声明它们(见注)。

我不清楚您要完成什么 - 不过,“全球化”可能不是您想要做的 - 我们应该努力消除代码中的全局变量。

注意:是的,Fortran(或者实际上是 FORTRAN)支持变量的隐式声明。然而,这是打孔卡和哑终端时代的遗物。 不要在任何地方使用隐式类型 - 你的代码应该总是包含implicit none,并且你应该适当地声明你的变量。

于 2009-07-22T15:15:45.063 回答
1

使用SAVE声明来存储跨子例程或函数调用的状态。

于 2015-06-15T21:02:05.387 回答
0

虚拟变量本质上是:虚拟参数。它们只是占位符,当调用函数时,它们会被您在调用函数时传递的任何内容替换。让我们看一个愚蠢的例子:

integer function add(x,y)
  integer :: x, y
  add = x + y
end

所以现在,您可以通过多种方式调用此函数。假设您要添加 a 和 b:

integer :: a, b, c

a = 3
b = 4
c = add(a,b)

这里,a 将在函数中占据 x 的位置,b 将占据 y 的位置。c 的值为 7。您可以轻松完成:

integer :: c

c = add(3,4)

结果相同。如您所见,全球化虚拟参数是没有意义的。

于 2012-12-22T02:37:35.613 回答