Fortran 中数组负索引的调试错误
我这里有一个测试程序:
program test
implicit none
integer(4) :: indp
integer(4) :: t1(80)
indp = -3
t1(indp) = 1
write(*,*) t1(indp)
end program test
第8行是错误的,因为indp是负数。但是当我使用“ifort”或“gfortran”编译它时,它们都找不到这个错误。 即使使用valgrind调试这个程序也找不到这个错误。 你有什么想法找到这种问题吗?
I have a test program here:
program test
implicit none
integer(4) :: indp
integer(4) :: t1(80)
indp = -3
t1(indp) = 1
write(*,*) t1(indp)
end program test
in line 8 it is wrong, because the indp is negative number. but when I compile it use 'ifort' or 'gfortran' both of them cannot find this error.
and even use valgrind to debug this program it also cannot find this error.
do you have any idea find this kind of problem?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Fortran 编译器不需要向您发出此类警告;一般来说,如果您将 Fortran 数组的下限设置为等于或小于 -3,则 t1(-3) = 1 可能是一个完全合理的语句,例如
肯定允许设置和读取 t1(-3)。
如果你想确保在运行时检查这些类型的错误,你可以使用 gfortran:
或 ifort 中的
-fbounds-check
进行编译:原因 valgrind没有意识到这一点有点微妙,但请注意,如果分配了数组,就会出现这种情况:
Fortran compilers aren't required to give you warnings about things like this; and in general, t1(-3) = 1 could be a perfectly reasonable statement if you set the lower bound of your fortran array to something equal to or less than -3, eg
would certainly allow setting and reading t1(-3).
If you want to make sure these sorts of errors are checked at runtime, you can compile with
-fbounds-check
with gfortran:or
-check bounds
in ifort:The reason valgrind doesn't catch this is a little subtle, but note that it would if the array were allocated:
没有错误。您将
indp
声明为具有一定范围和精度的整数(特定KIND <-在该术语的帮助中查找),可以是正数或负数。之后,您将
1
的值分配给t1(indp)
并将其写出。There is no error. You declared
indp
as an integer of a certain range and precision (of a certain KIND <- look up in help for that term), which can be either positive or negative.After that you assigned the value of
1
to ant1(indp)
and wrote it out.