【问题标题】:Array bounds checking in Fortran - is this dangerous?Fortran 中的数组边界检查 - 这很危险吗?
【发布时间】:2012-11-14 11:20:42
【问题描述】:

我有一些旧的 Fortran 代码,我正在使用最新的 Windows 英特尔编译器(在 Visual Studio 中运行)重新编译这些代码。可悲的是,我的 Fortran 技能有点生疏了。

此特定代码使用数组来记录程序执行期间发生的任何问题。这个数组是这样声明的:

CHARACTER FAIL(25)*(255)

这里有一段代码检查这个数组,如果它找到一个以'F' 开头的元素(即'失败')会做一些事情

      DO 20 CNTERR = OERRNO,ERRNO
         IF (FAIL(CNTERR)(1:1).EQ.'F') GOTO 9999
   20 CONTINUE

在几乎所有情况下OERRNOERRNO 都为零,因此CNTERR 也将为零。这意味着,我认为 - 由于 Fortran 使用基于 1 的数组 - 我正在查看一个不存在的元素。

使用 VS 中的默认“发布”配置,代码将毫无问题地编译和运行。它将编译但无法使用默认的“调试”配置运行。我认为重要的区别在于“调试”设置了“检查数组和字符串边界”选项,即/check:bounds

我的问题:如果使用“发布”配置构建,代码似乎可以正常运行。但我是否正在做一件会咬我的严重坏事?请求越界数组元素时,Fortran 会返回什么?

【问题讨论】:

    标签: arrays fortran


    【解决方案1】:

    我的问题:如果使用 “发布”配置。但我是不是在做一件严重的坏事 会咬我吗?当你要求一个 FORTRAN 时返回什么 数组元素越界?

    你是对的。越界访问总是错误的,是的,它很容易咬你。至于Fortran说会发生什么?好吧,它只是说你不能这样做,在这种情况下,实现可以做任何它喜欢的事情,从无到有,到输出有用的错误消息,到发出 3 分钟的警告。

    要修复它,我们需要更多代码,但我怀疑将 OERRNO 初始化为 1 可以解决问题,因为在 ERRNO=0 的情况下,将不会执行循环。

    另一件事:

    字符失败(25)*(255)

    我的 F77 生锈了,这里的 F90 风格不同,但我不确定这是否正确。我失败的记忆提示

    CHARACTER*255 FAIL(25)
    

    改为。

    【讨论】:

    • Fortran 77 支持CHARACTER FAIL(25)*255 作为CHARACTER*255 FAIL(25) 的替代方案,特别是如果您想在同一运算符中声明具有不同长度的字符串,例如CHARACTER*10 A, B*20, C.
    • 最安全/最简单的修复方法可能是将循环括在 if oerrno.gt.0 then 构造中。并且一定要在调试模式下运行该代码,直到找到所有这些东西..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多