FORTRAN 77中子例程参数的范围

马诺莱特

我有一个子例程,该子例程声明i并将其传递给其他小的子例程。在那些小的子例程中,声明了其他具有相同名称的变量,即i,并且在内部使用。一旦离开了小子例程,人们就会期望它具有与i最初传递的值相同的值,但这不是真实情况,并且i包含在小子例程中分配的最后一个参数的值。这是一个简单的示例:

subroutine smallSub1(i)
 integer i,start,end
 start=i
 end = start +10
 do i=start, end
    write(*,*) i
 enddo
end subroutine smallSub1

subroutine caller
integer i
i = 1
call smallSub1(i)
write(*,*) i
end subroutine caller

我的问题是,如何避免F77中的这种行为?

我在这里的担心是:考虑一个子例程是一个黑匣子的情况,您只需要传递一个整数,但是您不希望该整数值从smallSub1子例程中更改变量startend将取决于的值,i但是它们不应替换iout of中的原始值smallSub1

法国斯卡鲁斯

在给出的代码示例中,有两个变量i:每个子例程中都有一个。在子例程中calleri它是局部变量,在子例程中,smallSub1它是伪参数。

当您拥有时,call smallSub1(i)您将i通过参数关联将两个变量彼此关联。那么,在这种简单情况下,对iin的任何更改都会smallSub1影响iin caller这里有自变量关联的工作方式。

传统上,确实有一个黑匣子,当不希望在子例程中更改参数时,会在其中进行更改。例如,将其用作工作空间的地方。在这种情况下,一个人会做类似的事情

inew = i
call smallSub1(inew)
... continue using i

但是,在这种情况下,我可以轻松地更改子例程。引入一个额外的局部变量:

subroutine smallSub1(i)
  integer i   ! Dummy argument - we don't want to change it
  integer start,end
  integer j   ! Local variable - we're quite free to change it
              ! In general, we'd have j=i at the start and use that instead
  start=i
  end = start +10
  do j=start, end
     write(*,*) j
  enddo
end subroutine smallSub1

而且对于现代的Fortran,甚至可以拥有一个value属性,该属性可以应用于虚拟参数,从而可以在不影响实际参数的情况下对其进行更改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Fortran子例程中读取许多文件

来自分类Dev

在fortran的子例程中更新数组的值

来自分类Dev

R调用Fortran子例程

来自分类Dev

如何编译Fortran子例程

来自分类Dev

Fortran语法(子例程的声明)

来自分类Dev

FORTRAN:将伪参数传递给子例程

来自分类Dev

Fortran-模块子例程参数意图混淆-INOUT与OUT

来自分类Dev

R使用字符参数调用Fortran子例程

来自分类Dev

Fortran子例程/函数参数名称和声明

来自分类Dev

Fortran-模块子例程参数意图混淆-INOUT与OUT

来自分类Dev

FORTRAN:将伪参数传递给子例程

来自分类Dev

从C ++调用FORTRAN子例程会产生非法的参数值

来自分类Dev

Fortran 2008中类型绑定子例程中的可选参数

来自分类Dev

FORTRAN:子例程中的边界检查失败吗?

来自分类Dev

fortran函数/子例程中的Arbitray变量/数组类型

来自分类Dev

FORTRAN-子例程中的可分配数组

来自分类Dev

在Fortran 90中的模块内部使用子例程

来自分类Dev

fortran函数/子例程中的Arbitray变量/数组类型

来自分类Dev

使用子例程退出Fortran中的“ do while”循环

来自分类Dev

函数或子例程中的Fortran和接口块

来自分类Dev

如何使用C中的单位编号参数调用Fortran例程

来自分类Dev

从R调用并行的fortran MPI子例程

来自分类Dev

fortran模块的子例程名称冲突

来自分类Dev

Fortran子例程值关键字

来自分类Dev

fortran子例程:任意类型的数组

来自分类Dev

在Fortran子例程中分配数组

来自分类Dev

从C#调用FORTRAN子例程

来自分类Dev

Fortran将数字传递给子例程

来自分类Dev

C中是否有类似于Fortran中的子例程的子例程?