Управляющие символы Fortran (управление кареткой) все еще реализованы в компиляторах? - PullRequest
9 голосов
/ 21 июля 2010

В книге Фортран 95/2003 для ученых и инженеров много говорится о важности признания того, что первый столбец в выражении формата зарезервирован для управляющих символов.Я также видел контрольные символы, которые в Интернете называются элементами управления кареткой.

Чтобы избежать путаницы, под контрольными символами я ссылаюсь на символы «1, пробел (то есть \ s), 0 и +msgstr "как влияющий на вертикальный интервал вывода, когда помещен в первый столбец (символ) оператора FORMAT.

Кроме того, посмотрите эту текстовую веб-страницу, написанную полностью шрифтом фиксированной ширины: Управление кареткой на Фортране (потому что ничто так не кричит о точности и древности, как проза в моноширинном шрифте).Я обнаружил, что эта страница и другие подобные ей не совсем понятны.

Согласно Fortran 95/2003 для ученых и инженеров , если не вспомнить, что первый столбец зарезервирован для управления кареткой,привести к ужасному непреднамеренному выводу.Перефразируя Дейва Барри , введите неправильный символ, и по Норвегии будут выпущены ядерные ракеты.

Однако, когда я пытаюсь придерживаться этого строгого предупреждения, я обнаруживаю, что Гфортран понятия не имеет, что яЯ имею в виду.

Позвольте мне проиллюстрировать мою точку зрения с помощью некоторого примера кода.Я пытаюсь распечатать число Pi:

PROGRAM test_format
IMPLICIT NONE

REAL :: PI = 2 * ACOS(0.0)

WRITE (*, 100) PI
WRITE (*, 200) PI
WRITE (*, 300) PI
100 FORMAT ('1', "New page: ", F11.9)
200 FORMAT (' ', "Single Space: ", F11.9)
300 FORMAT ('0', "Double Space: ", F11.9)
END PROGRAM test_format

Это вывод:

1New page: 3.141592741
Single Space: 3.141592741
0Double Space: 3.141592741

"1" и "0" не являются опечатками.Похоже, что gfortran полностью игнорирует столбец управляющих символов.

Мой вопрос в следующем:

Управляющие символы по-прежнему реализованы в компиляторах, соответствующих стандартам, или gfortran просто не соответствует стандартам?

Для ясности вот вывод моего gfortran -v

Using built-in specs. Target: powerpc-apple-darwin9 Configured with: ../gcc-4.4.0/configure --prefix=/sw --prefix=/sw/lib/gcc4.4 --mandir=/sw/share/man --infodir=/sw/share/info --enable-languages=c,c++,fortran,objc,java --with-gmp=/sw --with-libiconv-prefix=/sw --with-ppl=/sw --with-cloog=/sw --with-system-zlib --x-includes=/usr/X11R6/include --x-libraries=/usr/X11R6/lib --disable-libjava-multilib --build=powerpc-apple-darwin9 --host=powerpc-apple-darwin9 --target=powerpc-apple-darwin9 Thread model: posix gcc version 4.4.0 (GCC)

Ответы [ 5 ]

10 голосов
/ 21 июля 2010

В прошлые годы игнорирование этого использования первого столбца могло привести к плохим вещам на линейном принтере, например к извлечению страниц - но когда в последний раз вы видели строчный принтер? В противном случае это зависело от устройства вывода, компилятора и ОС. Совет «Фортран 95/2003 для ученых и инженеров» был превосходен около 15 или 20 лет назад. С терминалами, postscript и другими современными принтерами, первый столбец больше не является особенным. Я больше не обращаю особого внимания на первый столбец, и у меня не было проблем.

В стандарте Fortran 2003 управление каретой указано как удалено , что редко встречается в стандартах языка Fortran. См. Страницу 359 «Объяснение Фортрана 95/2003» или страницу 326 «Справочника Фортрана 2003». Возможно, выбрав -std = f2003 или -std = f2008 с помощью gfortran, вы гарантируете, что в столбце 1 не будет использоваться элемент управления кареткой, так что «плохие вещи» абсолютно невозможны.

2 голосов
/ 15 марта 2011

Обычный принтер аппаратное обеспечение будет выполнять специальные действия в зависимости от содержимого столбца 1. Обратите внимание, что у линейных принтеров не было печатающей головки, которая двигалась вперед и назад - у них была цепь или барабан и 132 молотки, каждый из которых связан с байтом в буфере. Когда символ перед молотком совпадает с символом в буфере, молот будет под напряжением, и этот байт буфера будет пустым. Когда весь буфер был пуст, принтер загружал следующую строку.

Принтеры не имели понятия символов возврата каретки, перевода строки или перевода формы. Вместо этого они использовали первый символ буфера, чтобы указать, что, если что-то должно делать бумага перед печатью каждой строки. Некоторые коды будут продвигать бумагу на фиксированные суммы; другие коды выбирают одну из (IIRC) восьми колонок на устройстве считывания бумажной ленты и продвигают бумагу для печати и бумажную ленту вместе, пока в соответствующей колонке не будет обнаружено отверстие. Традиционно бумажная лента представляет собой петлю такой же длины, что и печатная страница, а в столбце 1 должно быть одно отверстие; бумага будет выстроена в очередь так, чтобы удержание столбца 1 происходило там, где должна была начаться печать на каждой странице. Я читал об одном магазине, который использовал тип двойной длины, и колонки 7 и 8 были выровнены с перфорациями перфорированной бумаги, обращенными внутрь и наружу. Хороший трюк - интересно, как это было распространено.

В любом случае символы управления кареткой могут быть соглашением, тесно связанным с языком, но они являются аппаратной функцией, а не языковой. На самом деле, нет особой гарантии, что «1» перейдет в начало страницы, за исключением того факта, что большинство, если не все магазины, так настроили свою ленту контроля каретки.

1 голос
/ 02 августа 2013

Да, компиляторы Fortran по-прежнему поддерживают управление каретой Fortran, хотя по умолчанию часто отключено.Например, в Intel Fortran нужно открыть файл с нестандартной (но широко распространенной) опцией CARRIAGECONTROL = 'FORTRAN'.Посмотрите, есть ли в gfortran что-то похожее.

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

1 голос
/ 21 июля 2010

Символы управления кареткой были определены для вывода на принтеры.Вывод на другие виды устройств (например, перфокарты, бумажную ленту или магнитные вращающиеся круглые предметы) не имел их.Если ваш вывод идет в файл на диске, то gfortran поступает правильно.

Edit: gfortran действительно делает правильные вещи.Если вы хотите дать команду драйверу принтера интерпретировать управляющие символы каретки Fortran вместо их буквальной печати, скажите это в команде lpr с помощью параметра f filter.См. Например http://www.computerhope.com/unix/ulpr.htm

1 голос
/ 21 июля 2010

Я считаю, что Fortran 95 был последней версией, в которой были указаны специальные значения для символов в столбце 1 печатной продукции.

...