英特尔Visual Fortran可分配固定长度字符串数组

时间:2017-01-10 16:30:00

标签: fortran allocation intel-fortran heap-corruption

运行Intel Parallel Studio 2015和Visual Studio 2012.启用Fortran 2003兼容性。

以下代码是否存在问题,因为它在我的计算机上造成了一个非常混乱(至少对我来说)堆损坏错误,并且我试图找出它是否是我无法正确理解的东西或编译器错误。

character(len=200), dimension(:), allocatable :: inFNs
real*8, dimension(:), allocatable :: times

inFNs = (/ "file1.dat", "file2.dat", &
           "file3.dat", "file4.dat", &
           "file5.dat", "file6.dat" /)

allocate(times(SIZE(inFNs))
!more code below

times的分配过程中代码会在没有堆栈跟踪的情况下崩溃,它会告诉我在调试模式下窗口对话框中发生了堆损坏。

我确定inFNs存在问题的方式是因为如果我将times分配移到inFNs以上,则会在稍后的分配调用期间发生此问题。

通过将申报行更改为:

,错误似乎消失了(敲木头)
character(len=:), dimension(:), allocatable :: inFNs

在我确定之前,我正在对我的代码中的另一个问题进行排序。

回答重复问题:

这与建议的问题不重复,原因很多,我对标记感到困惑。这个问题特别涉及可分配字符数组数组的语法,而不是一般的可分配数组。这个问题涉及英特尔Visual Fortran的潜在编译器错误,而另一个是关于英特尔Fortran和gFortran之间差异的问题。这个问题在尝试使用单独的数组时处理静默崩溃和堆损坏,而另一个处理在操作之后是否认为有问题的数组被分配。

更为重要的是,第二个问题的答案与此问题中的问题无关,因为该选项被打开或关闭不会影响所提出的问题。

说这两个问题是相同的,就像说我遇到了以下代码崩溃

real :: number
number = 4.d0

并且有人问另一个问题,询问为什么以下

存在问题
real :: number
number = 4
call add3ToDouble(number)

subroutine add3ToDouble(a)
    real*8 :: a
    a = a + 3.d0
end subroutine add3ToDouble

并且说答案都是“因为ifort默认为真实(kind = 4)”

0 个答案:

没有答案