Почему Photran Eclipse требует 'call flush(6)' после 'write', чтобы предотвратить буферизацию для вывода?
Я использую Classic Eclipse 4.2.2 с плагином Photran и компилятором cygwin gfortran на компьютере с Windows 7 Professional. Если я уберу 'call flush(6)' ниже, программа не запишет в консоль до ПОСЛЕ чтения из std в:
program mult1
implicit none
integer :: i,j,k
!
!
! This program just multiplies two integers
! together.
!
!
write(*,*) 'Enter i,j: '
call flush(6)
read(*,*)i,j
k = i*j
write(*,*) 'The product is ', k
stop
end program mult1
Есть мысли или исправления?
2 ответа
Я решил проблему, запретив ВСЕ буферизацию. Это не идеальное решение (было бы неплохо буферизовать некоторые выходные данные, а не другие), но это решает мою проблему, а именно - не нужно вызывать flush(6) каждый раз, когда я пишу (,).
Чтобы предотвратить всю буферизацию с помощью gfortran (ПРИМЕЧАНИЕ: это зависит от компилятора),
- Включить переменную среды: GFORTRAN_UNBUFFERED_ALL
- И присвойте ему значение: 1
В случае, если вы ИСПОЛЬЗУЕТЕ PHOTRAN (плагин Eclipse для Fortran), вам нужно будет сделать следующее:
- Перейдите в верхней панели, чтобы запустить> "Выполнить конфигурации".
- На левой панели выберите свой проект в выпадающем меню Локальное приложение Fortran> Ваш проект
- На правой панели выберите "Окно среды".
- Нажмите "Создать" и добавьте переменную и значение, указанные выше.
Код FORTRAN будет, если не указано иное направление, записывать в выходные данные "когда это похоже на это" или когда система чувствует, что позволяет это сделать. Это все о буферизации. Призыв к flush
ставится здесь именно по этой причине: писатель хотел заставить вывод прямо по очевидным причинам. Тем не менее, я никогда не видел код, который требовал сброса в этом контексте. Я бы поэкспериментировал с заменой write(*,*)
с print *,
,
Еще одна возможность может состоять в том, чтобы скомпилировать ваш код так, чтобы выходная буферизация не была разрешена. Проверьте справочные страницы для соответствующих флагов, если они существуют.