End of Record error when saving a variable

前端 未结 2 1582
梦谈多话
梦谈多话 2021-01-24 02:42

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 machi

相关标签:
2条回答
  • 2021-01-24 02:42

    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

    0 讨论(0)
  • 2021-01-24 02:51

    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.

    0 讨论(0)
提交回复
热议问题