Fortran子例程值关键字

Zuo*_* Lu 2 fortran subroutine

我有一个FORTRAN文件"testValueKeyword.for"包含以下代码

  subroutine intersub2(x,y)
    integer, value ::  x
    integer y
    x = x + y
    y = x*y
  print *, 'in subroutine after changing: ', x, y
  end subroutine

  program testValueKeyword
    integer :: x = 10, y = 20
    print *, 'before calling: ', x, y
    call intersub(x, y)
    print *, 'after calling: ', x, y
    x = 10
    y = 20
    call intersub2(x, y)
  contains
  subroutine intersub(x,y)
    integer, value ::  x
    integer y
    x = x + y
    y = x*y
    print *, 'in subroutine after changing: ', x, y
  end subroutine
  end program
Run Code Online (Sandbox Code Playgroud)

子程序intersub和intersub2包含相同的代码,两者都通过值传递x参数,但是intersub2似乎传递了一个类似于内存地址的大型随机整数.运行后我得到不同的y值.你能解释一下吗?

M. *_* B. 7

将子例程intersub2放入一个模块和use来自调用者的模块,这里是程序testValueKeyword,以便调用者"知道"要使用的调用约定.在过程(子例程或函数)中使用Fortran> = 90的"高级"参数功能时,需要使接口对调用者显式,以便调用者使用与过程相同的接口/调用约定.否则,呼叫者和被呼叫者之间的不一致将导致两者之间的"随机"通信.使接口知道的最简单方法是将过程放入模块和use模块中.你也可以用a来描述这个过程interface,但这需要更多的工作和第二件事要维护.

当我使用带有广泛警告选项的gfortran编译代码时,gfortran甚至会告诉我这个问题:

call intersub2(x, y)
                  1
Error: Dummy argument 'x' of procedure 'intersub2' at (1) has an attribute that requires an explicit interface for this procedure
Run Code Online (Sandbox Code Playgroud)

如果您正在使用gfortran,请尝试使用以下编译器选项进行调试: -O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace