【问题标题】:Fortran subroutine value keywordFortran 子例程值关键字
【发布时间】:2013-10-06 16:50:48
【问题描述】:

我有一个 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

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

【问题讨论】:

  • 类似于内存地址的随机整数实际上是初始化数据段内的地址,主程序中的x正在被存储。

标签: fortran subroutine


【解决方案1】:

将子程序 intersub2 放入一个模块中,并从调用者那里use 那个模块,这里编写 testValueKeyword,以便调用者“知道”要使用的调用约定。当您在过程(子例程或函数)中使用 Fortran >=90 的“高级”参数功能时,您需要使接口对调用者显式,以便调用者使用与过程相同的接口/调用约定。否则调用者和被调用者之间的不一致将导致两者之间的“随机”通信。使接口为人所知的最简单方法是将过程放入一个模块中并use 该模块。您也可以使用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

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

【讨论】:

    【解决方案2】:

    正如 MSB 所说,程序 testValueKeyword 不知道 intersub2 是什么,所以你得到垃圾数据也就不足为奇了。

    作为 MSB 建议编写 MODULE 的替代方法,您也可以将 intersub2 放入程序的 CONTAINS 部分并获得正确的结果。

    【讨论】:

      猜你喜欢
      • 2016-11-03
      • 1970-01-01
      • 2014-08-24
      • 2014-06-15
      • 2014-01-14
      • 2012-01-02
      • 2012-07-30
      • 1970-01-01
      • 2016-10-13
      相关资源
      最近更新 更多