我有一些遗留的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
几乎在所有情况下,OERRNO
和ERRNO
都为零,因此CNTERR
也将为零。我认为,这意味着 - 当Fortran使用基于1的数组时 - 我正在寻找一个不存在的元素。
使用VS中的默认“Release”配置,代码将编译并运行,没有任何问题。它将编译但无法使用默认的“Debug”配置运行。我认为,重要的区别在于'Debug'具有'Check Array和String Bounds'选项集,即/check:bounds
。
我的问题:如果使用“发布”配置构建,代码似乎可以正常运行。但是,我是否会做一件严重的坏事会咬我?当你要求一个超出范围的数组元素时,Fortran会返回什么?
答案 0 :(得分:4)
我的问题:如果使用的话构建代码似乎正确运行 '发布'配置。但是,我正在做一件严重的坏事 会咬我吗? FORTRAN在您要求时返回什么 越界数组元素?
你是对的。访问越界总是错误的,是的,它可能很容易咬你。至于Fortran说会发生什么?好吧它只是说你不能这样做,在这种情况下,实现可以做任何它喜欢的事情,从无到有,输出有用的错误信息,听到3分钟的警告。
要修复它,我们需要更多的代码,但我怀疑将OERRNO初始化为1将会这样做,因为在ERRNO = 0的情况下,循环将不会被执行。
另一件事:
CHARACTER FAIL(25)*(255)
我的F77生锈了,这里的F90风格不同,但我不确定这是不对的。我失败的记忆表明
CHARACTER*255 FAIL(25)
代替。