End of Record error when saving a variable

ぃ、小莉子 提交于 2019-12-02 08:08:03

问题


I'm having a runtime error when I run a code that works without problems using a different computer.

I'm wondering if the problem is the Fortran compiler of this machine (GCC 4.9.2) since the former computer used a previous version.

The issue comes when defining a variable like this:

In a module I define

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

Then in the subroutine sceneclass is defined according to

character(30) surf, frac, scene

allocate(sceneclass(10)) 

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

In the first iteration I get the "End of record". But I don't know where is the problem. It seems to work fine in other computers.


回答1:


You are probably writing a string to sceneclass(i) that is longer then the 30 chars you specified.

I can reproduce this with

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 fails with

Fortran runtime error: End of record

while ifort reports the error correctly:

output statement overflows record, unit -5, file Internal List-Directed Write

Increasing the string length to 12 solves the issue in this case. You can (and should) use iostat within the write statement to capture this.




回答2:


One thing to be aware of, when you specify a list directed * write of a character string, the compiler always(?) adds an extra lead blank, so the effective length of the string you can write is one less than you might expect.

To remedy that (and of course assuming you don't want the lead blank anyway ) use a string edit descriptor:

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

Interestingly ifort (linux 11.1) actually allows you to overrun by one character:

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

which I would consider a bug. It seems they forgot to count the blank too.. ( gfortran throws the above error on this, and ifort balks if you add one more character )

see here if you wonder why the blank.. Are Fortran control characters (carriage control) still implemented in compilers?

and now I'm curious if some compiler somewhere didn't do that for an internal list write, or maybe your code was previously compiled with a flag to disable the "printer control" code



来源:https://stackoverflow.com/questions/29489388/end-of-record-error-when-saving-a-variable

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!