2

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

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

CHARACTER FAIL(25)*(255)

这是一段代码,它检查这个数组,如果它找到一个以'F'(ie 'failed')开头的元素,它会做一些事情

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

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

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

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

4

1 回答 1

4

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

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

要修复它,我们需要更多代码,但我怀疑将 OERRNO 初始化为 1 会做到这一点,因为在 ERRNO=0 的情况下,将不会执行循环。

另一件事:

字符失败(25)*(255)

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

CHARACTER*255 FAIL(25)

反而。

于 2012-11-14T11:45:05.217 回答