运行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)”