2015-04-07 5 views
1

У меня возникла ошибка во время выполнения, когда я запускаю код, который работает без проблем с использованием другого компьютера.Ошибка завершения записи при сохранении переменной

Мне интересно, является ли проблема компилятором 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

Какова ценность 'scene'' surf' и 'frac'? Возможно, вам придется создать полностью компилируемый пример. –

ответ

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 runtime error: End of record

пока ifort сообщает об ошибке правильно:

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

Увеличение длины строки 12 решает эту проблему в Это дело. Вы можете (и должны) использовать iostat в заявлении write, чтобы зафиксировать это.

+0

Я создал сообщение [запрос/сообщение об ошибке] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65684) на сайте GCC. –

+0

В этом была проблема.По той же причине пробелы не были проблемой при использовании предыдущих версий gcc fortran. Благодаря! – cardogar

+0

@cardogar Бланки не должны быть проблемой! Кстати, именно поэтому я спросил, что находится в этих переменных, которые вы пишете, потому что это похоже на переполнение. Вы всегда должны предоставлять полную информацию в своем вопросе. И я не думаю, что сообщение об ошибке неверно, оно более или менее эквивалентно одному из них. –

1

Что нужно знать о том, когда вы указываете список, направленный на запись символьной строки, компилятор всегда (?) Добавляет лишний заполнитель, поэтому эффективная длина строки, которую вы можете записать, на единицу меньше, чем вы можете ожидать.

Чтобы исправить это (и, конечно, если вы не хотите, чтобы привести заготовку в любом случае) использовать строку редактирования дескриптора:

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

Интересно ifort (линукс 11,1) фактически позволяет захватить один символ:

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

, который я считаю ошибкой. Кажется, что они забыли посчитать пустой тоже .. (gfortran бросает выше ошибки на этом, и ifort уклоняется, если добавить еще один символ)

посмотреть здесь, если вам интересно, почему пустой .. Are Fortran control characters (carriage control) still implemented in compilers?

и теперь мне интересно, если какой-то компилятор где-то не сделал этого для записи внутреннего списка, или, может быть, ваш код был ранее скомпилирован с флагом, чтобы отключить код «управления принтером»

Смежные вопросы