Я знаю, что дескриптор $ edit отсутствует в стандарте и рекомендуется использовать advance="no"
, но этот небольшой пример показывает, что у них другое поведение (с ifort, но не с gfortran), и я не понимаю, почему(это меня не беспокоит, но если у кого-то есть объяснение, я заинтересован!).
program p
use sleep_mod
implicit none
integer :: i
character(len=80) :: mymsg
mymsg = 'H e l l o w o r l d ! W e l c o m e - B i e n v e n u e - W i l l k o m m e n'
!
!- Write the characters of "mymsg" on the same line with a time delay between them:
!
write(*,*)
do i = 1, len_trim(mymsg)
call usleep (onesec/4)
write(*,'(a1,$)') mymsg(i:i) ! ok w/ gfortran, ok w/ ifort
! write(*,'(a1)',advance='no') mymsg(i:i) ! ok w/ gfortran, KO w/ ifort
end do
write(*,'(/)')
end program p
Модуль sleep_mod имеет следующий вид:
module sleep_mod
use iso_c_binding
integer(c_int32_t), parameter :: onesec = 100000_c_int32_t
interface ! found in http://computer-programming-forum.com (by Tobias Burnu)
subroutine usleep (useconds) bind(C)
use iso_c_binding
implicit none
integer(c_int32_t), value :: useconds
end subroutine
end interface
end module sleep_mod
С$ version, независимо от того, что это за компилятор (ifort или gfortran), результат будет таким, как и ожидалось: задержка между печатью каждого символа.Тот же результат получается с версией с advance='no'
, скомпилированной с gfortran, но не с ifort.