【问题标题】:Pass a common variable to a subroutine in Fortran将公共变量传递给 Fortran 中的子例程
【发布时间】: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


【解决方案1】:

这是一个表现出您描述的行为的代码的最小工作示例。 A 在 main 中赋值,通过 common 传递给 sub_one,然后直接用作子程序参数。

 implicit none
 INTEGER :: A,res
 COMMON /VARS/ A
 A=41
 call sub_one()
 end 

 subroutine sub_one()
 INTEGER :: A,res
 COMMON /VARS/ A
 call sub_test(a,res)
 write(*,*)res
 end

 subroutine sub_test(var1, var2)
 INTEGER, intent(in) :: var1
 INTEGER, intent(out) :: var2
 var2 = 1 + var1
 return
 end

这编译没有问题并返回结果42

您能否提供显示问题的示例代码?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 2012-04-29
    • 2018-01-15
    相关资源
    最近更新 更多