当我运行使用不同计算机时没有问题的代码时,我遇到运行时错误。
我想知道问题是否是这台机器的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
在第一次迭代中,我得到了“记录结束”。但我不知道问题出在哪里。它似乎在其他计算机上运行良好。
答案 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?
,请看这里现在我很好奇,如果某个编译器某处没有为内部列表写入,或者您的代码以前编译时带有一个标志来禁用“打印机控制”代码