Loops 检查是否已使用Fortran 77声明变量?

Loops 检查是否已使用Fortran 77声明变量?,loops,null,fortran,Loops,Null,Fortran,我正在编写一些代码,其中大量变量被命名为abc1、abc2、abc3等。我想知道是否有人知道是否可以检查变量是否已设置,以便我可以轻松地循环一组变量,例如 do lbl1 i = 1,100 IF (.NOT. NULL(abc&i)) THEN print*, abc&i END IF lbl1..continue 任何信息都很好,非常感谢。我可以想到两个相关选项: 程序启动时,将所有这些变量设置为无效值(-9999)。在运行时检查该值 有

我正在编写一些代码,其中大量变量被命名为abc1、abc2、abc3等。我想知道是否有人知道是否可以检查变量是否已设置,以便我可以轻松地循环一组变量,例如

  do lbl1 i = 1,100
    IF (.NOT. NULL(abc&i)) THEN
      print*, abc&i
    END IF
  lbl1..continue

任何信息都很好,非常感谢。

我可以想到两个相关选项:

  • 程序启动时,将所有这些变量设置为无效值(-9999)。在运行时检查该值
  • 有些编译器有用于执行此操作的标志。例如,IBM编译器允许您初始化为特定的十六进制值:
  • -qinitauto=|-qnoinitauto
    初始化存储的每个字节或字
    自动将变量转换为指定的十六进制
    价值这会生成额外的代码和
    应仅用于确定错误。
    默认值:-qnoinitauto
    

    但是,正如手册页所说,“这会生成额外的代码,并且只能用于错误确定。”

    在Fortran中无法做到这一点:没有内在的方法来检查变量是否已定义(除了
    NULL()
    和仅适用于指针)。这里有三种实物期权:

  • 让编译器抱怨在编译时使用了未定义的变量。如果打开标准警告,我想不出一个编译器不这样做。例如,当与
    -Wall
    一起使用时,g95会说“警告(113):在(1)处使用了变量'a',但没有设置”,但如果没有,只会生成生成随机垃圾的代码。这种方法的问题在于,并非所有此类情况都能在编译时捕获—在链接之前分别编译这两个过程时,请考虑将未定义的变量传递到子例程中

  • 将所有变量设为“无效”,并在程序中检查此项。一种方法是手工完成(在代码中),但Pete使用编译器标志的第二种方法更好。使用实数比使用整数更容易,因为您可以将未定义变量的无效值设置为NaN,这将导致可执行文件停止运行(并提供有用的回溯)。对于g95
    -freal=NaN
    -fpointer=invalid
    很有用,
    -finteger=-9999
    可能会有所帮助,但可能不会提供非常有用的调试信息

  • 通过监视可执行文件如何访问内存,在运行时执行检查。我在memcheck方面取得了成功。您所需要做的就是使用调试标志(
    -g
    或其他什么)编译代码,并通过valgrind以
    --undef value errors=yes--track origins=yes
    运行您的程序,您应该会得到一份有用的报告,其中包含每种情况下未定义的变量和回溯。这将非常缓慢(所有内存访问都会被跟踪,状态位图也会更新),但它确实有效,即使对于Fortran也是如此

  • 在实践中,1和2可以结合起来捕获大多数案例——在尝试涉过大量valgrind输出寻找困难案例之前,您确实希望将大多数案例分类

       -qinitauto=<hex_value> | -qnoinitauto
            Initializes each byte or word of storage for
            automatic variables to the specified hexadecimal
            value <hex_value>. This generates extra code and
            should only be used for error determination.
    
            Default: -qnoinitauto