Почему 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 (ПРИМЕЧАНИЕ: это зависит от компилятора),

  1. Включить переменную среды: GFORTRAN_UNBUFFERED_ALL
  2. И присвойте ему значение: 1

В случае, если вы ИСПОЛЬЗУЕТЕ PHOTRAN (плагин Eclipse для Fortran), вам нужно будет сделать следующее:

  1. Перейдите в верхней панели, чтобы запустить> "Выполнить конфигурации".
  2. На левой панели выберите свой проект в выпадающем меню Локальное приложение Fortran> Ваш проект
  3. На правой панели выберите "Окно среды".
  4. Нажмите "Создать" и добавьте переменную и значение, указанные выше.

Код FORTRAN будет, если не указано иное направление, записывать в выходные данные "когда это похоже на это" или когда система чувствует, что позволяет это сделать. Это все о буферизации. Призыв к flush ставится здесь именно по этой причине: писатель хотел заставить вывод прямо по очевидным причинам. Тем не менее, я никогда не видел код, который требовал сброса в этом контексте. Я бы поэкспериментировал с заменой write(*,*) с print *,,

Еще одна возможность может состоять в том, чтобы скомпилировать ваш код так, чтобы выходная буферизация не была разрешена. Проверьте справочные страницы для соответствующих флагов, если они существуют.

Другие вопросы по тегам