保存变量时记录结束错误

时间:2015-04-07 10:28:32

标签: fortran runtime-error

当我运行使用不同计算机时没有问题的代码时,我遇到运行时错误。

我想知道问题是否是这台机器的Fortran编译器(GCC 4.9.2),因为以前的计算机使用的是以前的版本。

定义这样的变量时会出现问题:

在我定义的模块中

character(30),allocatable,save :: sceneclass(:)

然后在子程序sceneclass中根据

定义
character(30) surf, frac, scene

allocate(sceneclass(10)) 

do i=1,10
write(sceneclass(i),*) trim(scene)//trim(surf)//'_'//trim(frac)
enddo

在第一次迭代中,我得到了“记录结束”。但我不知道问题出在哪里。它似乎在其他计算机上运行良好。

2 个答案:

答案 0 :(得分:1)

您可能正在向sceneclass(i)写一个字符串,该字符串比您指定的30个字符长。

我可以用

重现这个
program test
  implicit none
  character(10),allocatable :: sceneclass(:)
  integer                   :: i

  allocate( sceneclass(10) ) 

  do i=1,10
    write(sceneclass(i),*) 10**i
  enddo

  print *, ( trim(sceneclass(i)), i=1,10 )

end program

gfortran失败

  

Fortran运行时错误:记录结束

ifort正确报告错误:

  

输出语句溢出记录,单位-5,文件内部列表定向写入

在这种情况下,将字符串长度增加到12可以解决问题。您可以(并且应该)在iostat语句中使用write来捕获它。

答案 1 :(得分:1)

有一点需要注意,当你指定一个字符串的*列表时,编译器总是(?)添加一个额外的空白,所以你可以写的字符串的有效长度是比你想象的少一个。

要解决这个问题(当然,假设你不想要导致空白),请使用字符串编辑描述符:

   write(sceneclass(i),'(a)')...

有趣的是ifort(linux 11.1)实际上允许你超出一个字符:

 character*5 c
 write(c,*)'12345'  ! result: " 1234"

我会考虑一个错误。似乎他们也忘了算空白了......(gfortran在这上面抛出了上面的错误,如果再添​​加一个字符就会出现错误)

如果你想知道为什么空白.. Are Fortran control characters (carriage control) still implemented in compilers?

,请看这里

现在我很好奇,如果某个编译器某处没有为内部列表写入,或者您的代码以前编译时带有一个标志来禁用“打印机控制”代码