Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Fortran将公共变量传递给子例程_Fortran_Local_Subroutine_Fortran Common Block - Fatal编程技术网

用Fortran将公共变量传递给子例程

用Fortran将公共变量传递给子例程,fortran,local,subroutine,fortran-common-block,Fortran,Local,Subroutine,Fortran Common Block,我正在定制一个商业代码,它深入使用公共块来定义全局变量 我想做的是只将这些变量中的一个传递给子例程,但不进行include,因为我不需要将其他几个变量定义为公共变量 我发现唯一的方法是先定义一个新的局部变量,给它分配全局变量的值,然后将新变量传递给子例程,但我不喜欢这种方法 在将变量传递给子例程时,是否有一种方法可以告诉Fortran将变量转换为局部变量 这里有一个例子: 主程序: INTEGER :: A REAL :: Y(20) COMMON /VARS/ Y, A INTEGER ::

我正在定制一个商业代码,它深入使用公共块来定义全局变量

我想做的是只将这些变量中的一个传递给子例程,但不进行include,因为我不需要将其他几个变量定义为公共变量

我发现唯一的方法是先定义一个新的局部变量,给它分配全局变量的值,然后将新变量传递给子例程,但我不喜欢这种方法

在将变量传递给子例程时,是否有一种方法可以告诉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
在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


你能提供显示问题的示例代码吗?

完成,谢谢你的建议。这个示例对我来说没有任何意义,是原始的还是你的“解决方案”,在上面的例子中,你是如何进入子例程的?我在看var2=A+var1,A从哪里来?我知道有坏记录,但事实上,一个完整的、简短的例子确实有帮助。子程序sub_测试显然有缺陷。请在这样的子例程顶部插入隐式NONE:编译器将向您解释变量A从未定义过。如果您使用的是公共块,包括子例程中的声明,但实际上没有传递任何内容,则它只允许子例程访问公共块中的变量。就我个人而言,我认为您正试图避免代码其余部分无法避免的事情。按住鼻子,将
COMMON/VARS/Y,A
插入子例程。或者卷起袖子,消除常见障碍。但你想做的既不是一个也不是另一个。