在Fortran中检查数组边界 - 这有危险吗?

时间:2012-11-14 11:20:43

标签: arrays fortran

我有一些遗留的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中的默认“Release”配置,代码将编译并运行,没有任何问题。它将编译但无法使用默认的“Debug”配置运行。我认为,重要的区别在于'Debug'具有'Check Array和String Bounds'选项集,即/check:bounds

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

1 个答案:

答案 0 :(得分:4)

  

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

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

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

另一件事:

  

CHARACTER FAIL(25)*(255)

我的F77生锈了,这里的F90风格不同,但我不确定这是不对的。我失败的记忆表明

CHARACTER*255 FAIL(25)

代替。