очистить экран на Фортране

Я довольно долго искал это. Кто-нибудь знает, как очистить экран в консольном приложении на языке Фортран? любая помощь будет очень оценена!


person rMaero    schedule 06.06.2012    source источник


Ответы (7)


Фортран, qua Фортран, ничего не знает о таких понятиях, как экраны или клавиатуры или, если на то пошло, компьютеры. Поэтому не существует стандартного для языка способа очистки экрана из Фортрана. Вам придется найти подход, зависящий от платформы.

У большинства компиляторов Fortran есть способ сделать это, например, Intel Fortran предоставляет функцию SYSTEM.

person High Performance Mark    schedule 06.06.2012
comment
+1 Я так давно не помню, чтобы когда-нибудь очищал терминал (или нуждался в его очистке)... Боже, я любил ФОРТРАН! - person MoonKnight; 06.06.2012
comment
Я использовал команду пакетного сценария Windows для очистки системы вызова экрана (cls) - person rMaero; 06.06.2012

В отличие от других, я бы не стал называть SYSTEM() (стандартная альтернатива Fortran 2008 — execute_command_line()), но я бы напечатал правильный escape-код ANSI http://en.wikipedia.org/wiki/ANSI_escape_code:

print *, achar(27)//"[2J"

Это будет намного быстрее, чем вызов SYSTEM().

Это работает в типичных терминалах Linux, но не будет работать в терминале MS Windows.

Другой более практичный справочник по использованию escape-кода: http://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html

person Vladimir F    schedule 06.06.2012
comment
На какую стандартную альтернативу Fortran 2003 вы ссылаетесь? - person High Performance Mark; 06.06.2012
comment
gcc.gnu.org/onlinedocs/gfortran/ - person Vladimir F; 06.06.2012
comment
Как сказано в ссылке, Fortran 2008 и более поздние версии, а не Fortran 2003. - person High Performance Mark; 06.06.2012
comment
Вы правы, у меня обычно проблемы с различением f2003 и f2008, так как компиляторы не реализуют функции в любом порядке :( - person Vladimir F; 06.06.2012
comment
@VladimirF - ... в любом порядке, что ты имеешь в виду? Они реализуют их в соответствии со стандартом, которому они принадлежат, и запросами пользователей. Они не реализованы в хронологическом порядке, если вы об этом. - person Rook; 06.06.2012
comment
Разные поставщики поддерживают разные наборы функций из f2003 и f2008. Некоторые функции из f2008 реализованы раньше других функций из f2003, но порядок зависит от поставщика. - person Vladimir F; 07.06.2012

В Fortran 90/95 лучшим вариантом является системная команда, которая является расширением, предоставленным поставщиком (т. е. не являющимся частью стандарта F90/95, поэтому некоторые малоизвестные компиляторы Fortran могут не иметь ее, но все основные имеют).

$ cat clear.f90
program
call system('clear')
end 
$ gfortran clear.f90 -o clear
$ ./clear 
person stali    schedule 06.06.2012

Это зависит от вашей конкретной системы и компилятора. Общего пути нет. Fortran не знает о конкретных аппаратных устройствах, таких как экраны терминалов и принтеры. (Как и большинство других языков). Детали полностью зависят от вашей конкретной системы.

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

См. здесь аналогичный вопрос, из которого были извлечены некоторые из вышеприведенного текста.

person MoonKnight    schedule 06.06.2012

В Fortran ACHAR(N) возвращает ASCII N, поэтому мой предпочтительный метод:

WRITE(*,'(2f15.9,A5)',advance='no') float1,float2,ACHAR(13)

ACHAR(13) возвращает символ возврата каретки \r в Python. Поэтому после печати он возвращает курсор в начало строки, где его можно перезаписать.

После того, как вы вышли из цикла, вы можете использовать CALL SYSTEM('clear') для очистки экрана.

Это полезно, так как CALL SYSTEM('clear') медленнее и использует много ресурсов процессора, вы можете проверить это, заменив приведенный выше метод на

WRITE(*,'(2f15.9)',advance='no') float1,float2;CALL SYSTEM('clear')

и проверьте разницу во времени, взятом в циклах.

person Shriraj Hegde    schedule 04.10.2020
comment
Однако это скорее четкая линия, чем чистый экран. В частности, то же самое сделал бы escape-код 1 G, переместите курсор в столбец 1. - person Vladimir F; 23.10.2020
comment
@VladimirF эта вещь ASCII 13 тоже не работает на всех терминалах, есть ли альтернативный способ? print *, achar(27)//"[2J" не кажется мне статичным на странице. - person Shriraj Hegde; 27.10.2020
comment
Зависит от вашей конкретной цели. Мой ответ был действительно просто для очистки экрана и ничего более. Если вам нужно что-то написать на статичном месте экрана, ASCII 13 неплох. Альтернативой является print *, achar(27)//"[1G", но он почти такой же, как ASCII 13, и работает только на некоторых терминалах. - person Vladimir F; 27.10.2020
comment
@VladimirF как насчет печати символов в файле clear.txt после clear > clear.txt? Это работает для меня. - person Shriraj Hegde; 13.11.2020

Это работает для меня в FTN95

program
call system('CLS')
end 
person user5020877    schedule 17.06.2015

Я нашел еще один способ очистить экран в UNIX-подобных системах, напечатав вывод команды clear
(из руководства по команде очистки, в котором говорится, что вы можете записать вывод в файл, а затем cat очистить экран)

Так что лучший способ - clear > temp.txt и использовать символы в файлах в операторе печати

Хотя оба делают одно и то же, вызов SYSTEM(foo) очень-очень (в 100+ раз) медленнее, чем прямая печать этих символов.

Например:

program clear
    implicit none
    INTEGER::i
    do i = 1, 1000
        print *, "Test"
        call system("clear")
    enddo
end program clear

Эта программа занимает от 3,1 до 3,4 секунд.

Но вместо вызова системы, если я напрямую напечатаю символы следующим образом:

program clear
    implicit none
    INTEGER::i
    do i = 1, 1000
        print *, "Test"
        print *, "[H[2J[3J"
    enddo
end program clear

Это дает точно такой же результат, но занимает от 0,008 до 0,012 секунды (от 8 до 12 мс).

На самом деле выполнение второго цикла 100 000 быстрее, чем CALL SYSTEM("clear") 1000 раз.

EDIT: не копируйте и не вставляйте отсюда, это не сработает (символы заменяются в StackOverflow)

Просто используйте clear > file и скопируйте содержимое файла в оператор печати.



Скриншот фактического кода (из предварительного просмотра):
screenshot
Эти символы не поддерживаются, я думаю, они исчезают в ответах (они отлично работают в предварительном просмотре)

person Shriraj Hegde    schedule 13.11.2020
comment
@VladimirF так не думаю, escape-код в вашем ответе для меня ведет себя как «ctrl + L», например, экран очищается, но курсор не возвращается, что-то в этом роде. Как и все письменные символы на терминале, заменяются символами пробела. - person Shriraj Hegde; 13.11.2020
comment
Есть 2J и 3J, они очень похожи: Если n равно 2, очистить весь экран (и переместить курсор в верхний левый угол в DOS ANSI.SYS). Если n равно 3, очистить весь экран и удалить все строки, сохраненные в буфере обратной прокрутки (эта функция была добавлена ​​для xterm и поддерживается другими терминальными приложениями). en.wikipedia.org/wiki/ANSI_escape_code - person Vladimir F; 13.11.2020
comment
@VladimirF IDK, даже print *,achar(27) // "[H[2J[3J" не дает точного результата, как CALL SYSTEM("clear") - person Shriraj Hegde; 13.11.2020
comment
Да, я пытаюсь понять, что именно он делает на самом деле. Является ли это специфичным для Unix-терминала и почему есть общий [2J. - person Vladimir F; 13.11.2020
comment
@VladimirF Проверьте мое редактирование, в ответе отсутствует символ, но он работает в предварительном просмотре - person Shriraj Hegde; 13.11.2020
comment
Хорошо, я понял, отсутствующий символ - ASCII 27 print *,achar(27),"[H",achar(27),"[2J",achar(27),"[3J" Это работает как задумано - person Shriraj Hegde; 13.11.2020
comment
Это то, что я предполагал. Это точно последовательности ANSI/CSI 2J и 3J, которые я связал. - person Vladimir F; 13.11.2020
comment
3J кажется необязательным, но [H кажется важным, чтобы не оставлять после себя пустые символы - person Shriraj Hegde; 13.11.2020