【发布时间】:2015-01-09 00:33:58
【问题描述】:
我正在定制一个商业代码,它深度使用公共块来定义全局变量。
我想做的只是将其中一个变量传递给子例程,但不包含,因为我不需要将其他几个变量定义为通用。
我发现这样做的唯一方法是预先定义一个新的局部变量,为其分配全局变量的值,然后将新变量传递给子例程,但我不喜欢这种方式继续..
有没有办法告诉 Fortran 在将变量传递给子程序时将其转换为局部变量?
这里有一个例子:
主程序:
INTEGER :: A
REAL :: Y(20)
COMMON /VARS/ Y, A
INTEGER :: res, transfer_var
transfer_var = A
call sub_test(transfer_var, res)
...
子程序:
subroutine sub_test(var1, var2)
INTEGER, intent(in) :: var1
INTEGER, intent(out) :: var2
var2 = 1 + var1
return
end
【问题讨论】:
-
完成,感谢您的建议
-
那个例子对我来说没有任何意义,是原始的还是你的“解决方案”
-
在上述情况下,你是如何让 A 进入子程序的?我正在查看 var2 = A + var1 行,A 来自哪里?我知道破纪录,但确实是一个完整的简短示例显示问题确实有帮助。
-
子程序 sub_test 显然有问题。请在此类子程序的顶部插入 IMPLICIT NONE :编译器将向您解释变量 A 从未被定义。
-
如果您遇到公共块,包括子程序内的声明实际上并没有传递任何东西,它只是让子程序访问公共块中的变量。就我个人而言,我认为您正在试图避免其余代码无法避免的事情。捏住鼻子,将
COMMON /VARS/ Y, A插入子程序。或者卷起袖子,消除常见的障碍。但是你要做的不是一个也不是另一个。
标签: fortran local subroutine fortran-common-block