Text
                    COMPUTER SCIENCE SERIES
FORTRAN 77
HARRY KATZAN, Jr.
Chairman, Computer Science Department
Pratt Institute
VAN NOSTRAND REINHOLD COMPANY
NEW YORK . CINCINNATI • ATLANTA . DALLAS
SAN FRANCISCO . LONDON • TORONTO . MELBOURNE
1978


МАТЕМАТИЧЕСКОЕ ОБЕСПЕЧЕНИЕ ЭВМ Г.Катцан ЯЗЫК ФОРТРАН 77 Перевод с английского Н. И. Вьюковой и А. О. Лациса под редакцией Ю. М. Банковского МОСКВА «МИР» 1982
ББК 32.973 К29 УДК 681.3 Катцан Г. К29 Язык Фортран 77: Пер. с англ.—М.: Мир, 1982.— 208 с, ил. Фортран — один из первых языков программирования. Его различные диалекты обобщены в новом стандарте, включающем современные управляющие структуры, дополнительные типы данных, средств ввода-вывода. Автор книги— американский ученый* известный по переводу его книги «Операционные системы* J (М.: Мир, 1976). ■ Для программистов, разработчиков программного обеспечения, студентов и аспирантов вузов. 20204-033 А А ББК 32.973 К 041 (01)-82 33"82' ч' * 2405000000 6ф? 3 Редакция литературы по математическим наукам Гарри Катцан ЯЗЫК ФОРТРАН 77 Научный редактор Л. H. Бабынина. Мл. научный ред. H. С. Полякова. Художник В. М. Новоселова. Художественный редактор В. И. Шаповалов. Технический редактор Г. Б, Алюлина. Корректор Т. П. Пагаковская ИБ № 2955 Сдано в набор 29.10.81. Подписано к печати 17.04.82. Формат 60X90Vie- Бумага типографская № 2. Гарнитура латинская. Печать высокая. Объем 6,5 бум. л. Усл. печ. л. 13,00. Усл. кр.-отт. 13,35. Уч.-изд. л. 10,72. Изд. № 1/1740. Тираж 65 000 экз. Зак. 3501. Цена 80 коп. ИЗДАТЕЛЬСТВО «МИР» Москва, 1-й Рижский пер., 2 Ордена Октябрьской Революции и ордена Трудового Красного Знамени Первая Образцовая типография имени А. А. Жданова Союз пол игр афпрома при Государственном комитете СССР по делам издательств, полиграфии и книжной торговли. Москва, М-54в Валовая, 28 © 1978 by Litton Educational Publishing* Ino Сф Перевод на русский язык, «Мир», 1982
ПРЕДИСЛОВИЕ РЕДАКТОРА ПЕРЕВОДА Выход настоящей книги на русском языке совпадает по времени с 25-летием появления первого транслятора с языка Фортран. И несмотря на то, что вслед за Фортраном были разработаны новые, в некоторых отношениях более совершенные языки (Алгол, ПЛ/I, Паскаль), Фортран прочно сохраняет свои позиции при проведении научно-технических расчетов. В течение 25 лет менялись и усложнялись задачи, для решения которых был предназначен Фортран, совершенствовались методы программирования. Все это требовало развития языка; введения новых структур данных и управляющих структур. Наличие многочисленных диалектов — характерная черта Фортрана. Однако диалекты не стали серьезным препятствием для широкого обмена программами, написанными на Фортране. Этому немало способствовала работа по стандартизации языка, которая началась еще в 1962 г. В 1966 г. был утвержден первый американский стандарт Фортрана. Дальнейшая работа в этом направлении привела к утверждению нового стандарта языка, названного Фортраном 77. Введение стандарта не приводит к кардинальному пересмотру языка: сохраняются строй и стиль, соблюдаются преемственность и начальная цель — эффективное решение задач численного анализа. В сущности стандарты закрепляют новые черты Фортрана, прошедшие основательную проверку в разных его диалектах и de facto ставшие нормой языка. Заимствуется также все полезное и из других языков, возможно не нашедших столь широкого применения. В чем-то этот процесс сходен с тем, который характерен для естественных языков. После утверждения стандарта Фортрана 77 работа по развитию и совершенствованию языка не прекратилась. Вначале высказывалось мнение, что новый стандарт должен вводиться каждые пять лет. Поэтому в плане подготовки Фортрана 82 были согласованы новые возможности языка: новый для Фортрана тип данных BIT и соответственно операции над цепочками двоичных разрядов, цикл DO...[EXIT]...REPEAT взамен прежнего DO-цик- ла, заканчивающегося меткой, операции над массивами, гетерогенные структуры данных — записи и т. д.
6 Предисловие редактора перевода Иным стал взгляд и на архитектуру языка. Решено было строить язык как ядро + модули. Причем ядро Фортрана само по себе должно быть «универсальным, мобильным, надежным, эффективным, лаконичным и современным» языком и должно согласовываться с модулями, которые с одной стороны будут включать атавизмы и новые средства языка, а с другой — отражать прикладную направленность языка. Разрабатываются модули, содержащие средства для управления базами данных, для управления промышленными процессами, протекающими в реальном масштабе времени, для вывода информации в графической форме. Огромный фронт работ не позволил уложиться в ранее намеченные сроки. Теперь планируется закончить и представить на обсуждение версию стандарта в 1985 г., а к концу десятилетия начать широкую эксплуатацию языка и таким образом обеспечить нужды потребителей Фортрана до конца столетия. Книга Г. Катцана — одна из первых книг, содержащих полное описание Фортрана 77. С этой точки зрения она будет интересна специалистам, занимающимся разработкой и реализацией языков программирования. Полезна она будет и всем, кто программирует на Фортране, поскольку Фортран 77 уже реализован на многих машинах, и в частности на БЭСМ 6. Ю. М. Банковский
{ ПРЕДИСЛОВИЕ i i. 1 т ч 1 !Язык Фортран первоначально был разработан для приложений, связанных с обработкой числовых данных; язык был подготовлен фирмой ИБМ для массового использования в 1957 г. С 1957 j по 1966 г. он сформировался как научно-ориентированный язык I программирования, и в 1966 г. был разработан стандарт Форт- I рана. Язык получил поддержку у фирм — поставщиков ЭВМ, и, I благодаря принятию стандарта 1966 г., программа, разработанная для одной ЭВМ, могла без всяких изменений работать и на | другой ЭВМ. За всю недолгую историю вычислительной техники | различными организациями в разработку программ на Форт- | ране были вложены многие миллионы долларов. | С годами сфера приложений Фортрана расширилась, охва- Т тив не только область чисто численных приложений, но и такие, Т например, области, как работа с текстами и файлами. В резуль- | тате большинство поставщиков ЭВМ и программного обеспечения I стали расширять свои версии Фортрана, включая в них более | мощные средства обработки данных. Ясно, что благодаря этим f прогрессивным средствам резко увеличилась область возможных | приложений Фортрана, но за счет ухудшения переносимости на- у писанных на Фортране программ. Короче говоря, стал необхо- 1 дим новый стандарт. I Проект нового стандарта Фортрана был опубликован в марте I 1976 г., и с этого момента началась деятельность по доработке ft" стандарта. Недавно принятая окончательная версия нового стан- Y дарта Фортрана и составляет предмет этой книги. 4 ' Новый стандарт Фортрана не исключает использования ста- ' рых фортранных программ, он лишь расширяет возможности языка в следующих направлениях: ввод-вывод, средства описания данных, средства описания подпрограмм, конструкции, в которых ранее допускались только значения целого типа, а также со- 1
8 Предисловие щ держит ряд усовершенствований разнообразного характера. Пе- 1 речислим более подробно расширения по сравнению со стандар- 1 том 1966 г.: I 1 Ввод-вывод 3 Работа с файлами не только последовательного, но и прямого ;] доступа Ввод-вывод в свободном формате J Внутренняя передача данных (из одной области памяти в другую) | Инструкции для открытия (OPEN) и закрытия (CLOSE) файлов, j а также для получения информации о свойствах и состоянии | файла (INQUIRE) Обмен данными со стандартным системным устройством без яв- 1 ного указания номера канала ] Дополнительные спецификации форматов для табуляции, уп- i равления вводом пробелов и выводом знака j Средства описания данных ] Описание текстовых подцепочек фиксированной длины, над ко- 1 торыми допускаются операции конкатенации, вычисления длины, взятия подцепочки, присваивания и операции отношения Описание символических констант (например, PARAMETER (Р1=3.14159)) Сохранение значений переменных и массивов от одного обращения к подпрограмме до другого ] Указание имени главной программы Указание правила для неявного определения типа (определения типа по первой букве имени) Использование отрицательных, нулевых и положительных це- ] лых выражений-констант в описаниях границ массивов; до- I пускается от одного до семи измерений Употребление имен массивов, текстовых подцепочек и неявных 1 циклов в инструкции DATA I Употребление имен массивов и текстовых подцепочек в инструк- | ции EQUIVALENCE j
Предисловие Средства описания подпрограмм Указание нескольких точек входа в подпрограмму Указание нескольких точек возврата из подпрограммы различение внешних и внутренних (встроенных) подпрограмм Универсальные имена для стандартных функций (например, ABS) функции без аргументов Описание нескольких подпрограмм данных Употребление целых выражений вместо целых значений в еле* дующих конструкциях Индексы массивов Управляющие параметры DO-циклов и неявных циклов Номера меток в вычисляемых инструкциях GOTO Номера внешних каналов в инструкциях BACKSPACE, END- FILE и REWIND Прочие расширения DO-циклы и неявные циклы, которые могут выполняться 0 раз и иметь отрицательный шаг Употребление метки формата в инструкции ASSIGN Указание последовательности десятичных цифр или текстовой подцепочки в инструкциях PAUSE и STOP Употребление имени подпрограммы данных в инструкции EXTERNAL Употребление выражений двойной точности, вещественного и целого типа в качестве управляющих параметров DO-циклов и неявных циклов в инструкциях ввода-вывода Инструкции IF, ELSE IF, ELSE и ENDIF, позволяющие задавать условное выполнение групп инструкций Помимо перечисленных расширений книга содержит полное описание языка Фортран, включая синтаксис, семантику, а также примеры. Цель книги состоит в том, чтобы дать исчерпывающее описание нового стандарта Фортрана в доступном и ясном изложении.
10 Предисловие Эта книга будет полезна специалистам в области естественных наук, а также всем, использующим Фортран постоянно или от случая к случаю. Благодаря специальным образом подготовленным синтаксическим диаграммам, книга дает полное описание не только новых средств Фортрана, но и стандарта для языка Фортран 1966 г. Таким образом, книга может служить как удобным справочником, так и источником информации о новых возможностях языка. Автор рад выразить признательность Дж. К. Ноллу и Уэйн А. Линдо за содействие и своей жене Маргарет за ценную помощь в работе над книгой.
1 ВВЕДЕНИЕ 1.1. ПРЕДМЕТ КНИГИ Фортран — это язык программирования с математической ориентацией, который разрабатывался для приложений ЭВМ, связанных с обработкой числовых данных. (Название Фортран (FORTRAN) образовано из слов ФОРмула и ТРАНсляция (FOR- mula TRANslation).) Трансляторы для языка Фортран имеются почти на всех вычислительных машинах; они либо поставляются фирмами вместе с компьютерами, либо разрабатываются по месту использования машины, либо предоставляются специальными фирмами — поставщиками программного обеспечения. Язык этот знают и используют — постоянно или от случая к случаю — большинство инженеров, ученых, математиков, статистиков, экономистов. В результате в разработку и поддержание программ на Фортране различными организациями были вложены многие миллионы долларов. 1.1.1. Историческая справка Первоначальная версия языка Фортран была разработана фирмой ИБМ и стала доступна пользователям в 1957 г. С 1957 по 1966 г. язык Фортран получил широкое признание и распространение как язык для научных приложений. В 1966 г. был принят стандарт языка Фортран, так что программа на Фортране, разработанная для некоторой вычислительной системы, если она удовлетворяла стандарту, могла без всяких изменений использоваться и на другой вычислительной системе. 1.1.2. Расширения Фортран первоначально разрабатывался для численных приложений, и стандарт 1966 г. выражает запросы соответствующего класса пользователей. С годами, однако, сфера применения Фортрана расширилась, охватив не только область сугубо численных приложений, но и такие, например, области, как обработка текстов и работа с файлами. В результате большинство фирм стали расширять свои версии Фортрана, включая в них более мощные средства обработки данных. Благодаря этим сред-
12 1. Введение ствам, называемым обычно расширениями, увеличилась область потенциальных приложений Фортрана, но за счет ухудшения переносимости написанных на Фортране программ. Короче говоря, необходим стал новый стандарт. 1.1.3. Разработка нового стандарта Фортрана Проект нового стандарта для языка Фортран был опубликован в марте 1976 г., и с этого момента началась деятельность по подготовке окончательной версии стандарта. Недавно (в апреле 1978 г.) была принята окончательная версия нового стандарта для Фортрана, которая и составляет предмет данной книги. Новый стандарт называется Фортраном 77. 1.1.4. Расширения, вошедшие в новый стандарт Фортрана Новый стандарт Фортрана не'исключает использования старых фортранных программ, он лишь расширяет возможности языка в следующих областях: ввод-вывод, описания данных, описания подпрограмм и конструкций, в которых ранее допускались только значения целого типа,— а также включает ряд усовершенствований разнообразного характера. Вот краткий перечень вошедших в стандарт 1977 г. расширений по сравнению со стандартом 1966 г.: Ввод-вывод 1. Работа с файлами не только последовательного, но и прямого доступа 2. Передача данных в свободном формате 3. Внутренняя передача данных (из одной области оперативной памяти в другую) 4. Инструкции для открытия (OPEN) и закрытия (CLOSE) файлов, а также для получения информации о состоянии и свойствах файла (INQUIRE) 5. Обмен данными со стандартным системным устройством без явного указания номера канала 6. Дополнительные спецификации формата, управляющие табуляцией, выводом знака и вводом пробелов Описание данных 1. Описание текстовых цепочек фиксированной длины, над которыми допускаются операции конкатенации, вычисления длины, взятия подцепочки, присваивания и операции отношений 2. Описание символических констант (например, PARAMETER (Р1=3.14159)) 3. Сохранение значений переменных и массивов от одного обращения к подпрограмме до следующего
1. L Предмет книги 13 4. Указание имени главной программы 5. Указание правила для неявного определения типов (определение типа по первой букве имени) 6. Использование отрицательных, нулевых и положительных выражений-констант целого типа в описаниях границ массивов; допускается от одного до семи измерений 7. Использование имен массивов, текстовых подцепочек и неявных циклов в инструкции DATA 8. Использование имен массивов и текстовых подцепочек в инструкции EQUIVALENCE Описание подпрограмм 1. Указание нескольких точек входа в подпрограмму 2. Указание нескольких точек выхода из подпрограммы 3. Различение внешних и стандартных (встроенных) подпрограмм 4. Указание универсальных имен для стандартных функций (например, ABS) 5. Описание функций без аргументов 6. Описание нескольких подпрограмм данных Использование целых выражений вместо целых значений в следующих конструкциях 1. Индексы массивов 2. Управляющие параметры DO-цикла и неявного цикла 3. Номера меток в вычисляемых инструкциях GOTO 4. Номера каналов в инструкциях BACKSPACE, ENDFILE и REWIND Прочие расширения 1. DO-циклы и неявные циклы, которые могут выполняться О раз и иметь отрицательный шаг 2. Использование метки формата в инструкции ASSIGN 3. Указание последовательности десятичных цифр или текстовой цепочки в инструкциях PAUSE и STOP 4. Использование имени подпрограммы данных в инструкции EXTERNAL 5. Использование выражений двойной точности, целого и вещественного типов в качестве параметров DO-циклов и неявных циклов в списках ввода-вывода 6. Инструкции IF-структурная, ELSE IF, ELSE и END IF, позволяющие задавать условное выполнение групп инструкций Новый стандарт включает, кроме того, разнообразные лексические, синтаксические и семантические усовершенствования, а также более точные спецификации способов интерпретации и выполнения программ, удовлетворяющих стандарту.
14 1. Введение 1.2. ПЛАН КНИГИ Цель данной книги — дать техническое описание языка Фортран 77 по возможности в наиболее доступной форме. С тем чтобы удовлетворить запросы различных групп читателей, использовано несколько форм описания. Благодаря специальным образом составленным синтаксическим диаграммам книга содержит описание не только Фортрана 77, но и стандарта Фортрана 1966 г. В этом смысле синтаксические диаграммы служат для подробного сравнения стандарта 1966 г. и нового стандарта Фортрана. 1.2.1. Круг читателей Книга предназначена для широкого круга инженеров, ученых, математиков, статистиков, экономистов, которые знакомились с Фортраном либо в учебном заведении, либо на специальных курсах, либо в процессе практического применения языка. Книга может оказаться полезной не только активным пользователям Фортрана, для полного ее понимания достаточно иметь лишь общее представление о языке. Книга предназначена также и для опытных программистов, использующих Фортран и желающих ознакомиться с содержанием нового стандарта языка. Для удовлетворения запросов всех этих категорий читателей в книге использованы следующие способы представления материала: 1. Вводный материал 2. Метаязыковые описания 3. Примеры на языке Фортран 77 4. Синтаксические диаграммы 5. Пояснительные замечания Таким образом, для каждой темы читатель может выбрать соответствующий уровень изложения — в зависимости от вида интересующей его информации. 1.2.2. Круг вопросов В совокупность рассматриваемых аспектов языка входят следующие вопросы: 1. Правильная форма инструкций и программ на языке Фортран 77 2. Особые правила интерпретации и выполнения удовлетворяющей стандарту программы и ее данных 3. Форма вводных данных для программы, удовлетворяющей стандарту языка Фортран 77
1.3. Синтаксические обозначения is 4. Вид выводных данных, которые порождает программа, удовлетворяющая стандарту языка Фортран 77 Таким образом, излагаемый материал может быть полезен не только тем читателям/для которых язык является инструментом программирования, но и специалистам, занятым разработкой компиляторов и интерпретаторов для языка Фортран 77. 1.2.3. Сравнение старого и нового стандартов Используемое представление материала позволяет также провести детальное сравнение стандарта Фортрана 1966 г. и нового стандарта Фортрана. Например, следующая синтаксическая диаграмма для инструкции CALL: инструкция _ call! ■CALL имя „подпрограммы - выражение- -имя_массива- - имя_процедуры- ■* метка ) не только описывает синтаксис инструкции, но и указывает, что возможность передачи параметра вида * метка (альтернативный возврат) является расширением по сравнению со стандартом 1966 г. (Более точно, пути, помеченные знаком • на синтаксических диаграммах, содержат расширения по сравнению со стандартом Фортрана 1966 г.) Семантические расширения языка, а также изменения языка, которые нельзя рассматривать как расширения, обсуждаются в основном тексте. Различные соглашения, касающиеся правил выполнения программ, рассматриваются в последующих главах книги. 1.3. СИНТАКСИЧЕСКИЕ ОБОЗНАЧЕНИЯ Для описания языка Фортран 77 используются две системы синтаксических обозначений — расширенная форма Бэкуса и синтаксические диаграммы. Как правило, инструкции, а также некоторые конструкции языка Фортран 77 описываются в основном тексте при помощи расширенной формы Бэкуса. Большинство читателей знакомы с расширенной формой Бэкуса или
16 1. Введение с соответствующим набором метаязыковых обозначений и символов. Синтаксические диаграммы по своей описательной мощности эквивалентны расширенной форме Бэкуса или формализму Бэкуса — Наура, и многие находят их довольно удобными для восприятия. Все инструкции и конструкции языка Фортран 77 описаны при помощи синтаксических диаграмм либо в основном тексте, либо в приложении. Пример синтаксической диаграммы приведен в предыдущем разделе. 1.3.1. Расширенная форма Бэкуса Расширенная форма Бэкуса — это набор метаязыковых обозначений и символов, полезный для описания определенного класса языков программирования, представителем которого является Фортран 77. Расширенная форма Бэкуса является развитием формализма Бэкуса — Наура (БНФ), разработанного для описания языка Алгол 60. При описании языка в расширенной форме Бэкуса используются следующие правила и соответствующие символы: 1. Металингвистическая переменная служит для обозначения некоторого понятия языка Фортран. Она может иметь одну из трех форм. (1) Последовательность строчных букв, между которыми может встречаться разделитель «подчеркивание», например: имя.функции дсписок об (2) Последовательность из одной или более строчных букв с индексом в конце, например: (3) Одна из указанных выше двух форм, но выделенная курсивом, например: исписок &г тип а (Конструкция выделяется курсивом в тех случаях, когда на нее требуется обратить особое внимание, например для выделения тех элементов в описании некоторой инструкции, которые следует заменить конкретными значениями при записи инструкции в реальной программе.)
1.3. Синтаксические обозначения 17 2. Металингвистическая связка служит для обозначения самой себя и записывается в виде последовательности прописных букв, знаков препинания и специальных литер. Металингвистическая связка записывается в программе точно так, как она записана в синтаксическом описании. Например, в инструкции ASSIGN s TO i ключевые слова ASSIGN и ТО являются металингвистическими связками, a s и i — металингвистическими переменными. Аналогично в инструкции IF (e) sit s2, s$ ключевое слово IF, скобки и запятые — это металингвистические связки, а строчные буквы с индексами — металингвистические переменные. 3. Пара скобок [ ] указывает на то, что заключенные в скобки синтаксические элементы могут быть опущены. Так, в инструкции цикла DOs[ , ] i=eue£ye^ запятая после метки и приращение, обозначенное через ев, необязательны и могут быть опущены. 4. Синтаксический элемент — это металингвистическая переменная, металингвистическая связка или последовательность металингвистических переменных и связок, заключенная в скобки. 5. Символ повторения — три точки — означает, что стоящий перед ними необязательный элемент может быть повторен нуль или более раз подряд. Например, в инструкции INTEGER v [, v\. . . символ повторения указывает, что в инструкции INTEGER может быть описано более одной переменной или массива, обозначаемых буквами v, целого типа. Знак повторения не требует, чтобы предшествующий ему синтаксический элемент присутствовал хотя бы один раз. Пробелы в Фортране используются для улучшения внешнего вида программы, но не являются значащими литерами, если не оговорено противное. 1.3.2. Синтаксические диаграммы Синтаксическая диаграмма позволяет дать представление о той или иной структуре языка в целом, и по сравнению с ме- таязыковым описанием обладает одним очевидным преимуще-
18 /. Введение ством — она легче для восприятия. Используемый в данной книге формализм синтаксических диаграмм эквивалентен формализму Бэкуса — Наура, при помощи которого был описан язык Алгол 60, и расширенной форме Бэкуса. Все, что в синтаксической диаграмме записано прописными буквами или при помощи специальных литер, именно в таком виде записывается и в программе. Последовательности строчных букв с подчеркиваниями обозначают синтаксические элементы и должны заменяться при записи инструкции в реальной программе. Синтаксическая диаграмма имеет вид железнодорожного разъезда, на котором развилки соответствуют синтаксическим альтернативам. Кружок и дуга указывают, сколько раз можно пройти по данному пути: /г, заключенное в кружок, означает, что по этому пути нужно пройти ровно п раз п под дугой означает, что по этому пути можно пройти не более п раз Пути на диаграммах, которые содержат расширения по сравнению со стандартом Фортрана 1966 г., отмечены черным кружком (•). Таким образом, синтаксические диаграммы служат для описания как языка Фортран 77, так и стандарта Фортрана 1966 г. Ниже приводятся примеры синтаксических диаграмм. Пример 1. Логическая константа описывается диаграммой у Ьлогическая_константа: TRUE. v FALSE; V (альтернативы) Синтаксическая диаграмма показывает, что логическая константа— это либо .TRUE., либо .FALSE. . Пример 2. Целая константа описывается диаграммой целая _ константа: / ,— {наименование 1 конструкции) v— знак - рцифра-ч / (возврат означает возможность повторения) Целая константа состоит из знака, который может отсутствовать, и последовательности из одной или более цифр.
1.4. Основные понятия языка Фортран 77 и терминология 19 Пример 3. Метка описывается диаграммой п Е: Лю этому пути можно у^ пройти не более 5 раз) цифра- "" Метка должна содержать цифру, отличную от нуля Метка содержит от одной до пяти десятичных цифр. Пример 4. Инструкция вычисляемого перехода описывается диаграммой вычисляемый переход: (шот *ут содеР»<™ расширвшш - _>eK«*w ло,сравнению с Фортраном 19668.) v- 6(Г ТО < -у- метка -у- ) -т—• г целое_выг- — Эта синтаксическая диаграмма указывает, что в инструкции вычисляемого перехода в качестве расширения вместо целой переменной разрешается использовать целое выражение. Синтаксические диаграммы полезны и, возможно, даже более полезны, чем обычные метаязыковые описания, при условии что читателю известны следующие особенности языка Фортран 77: 1. Употребление пробелов 2. Употребление строк комментариев 3. Структура начальной строки инструкции и строк продолжения 4. Контекстно-зависимые особенности, такие, как требования к типам данных или единственность меток Синтаксические диаграммы дают также ясное представление об альтернативах, которые допускаются в той или иной конструкции языка Фортран 77. 1.4. ОСНОВНЫЕ ПОНЯТИЯ ЯЗЫКА ФОРТРАН 77 И ТЕРМИНОЛОГИЯ Одной из наиболее замечательных особенностей стандарта Фортран 77 является точное определение и разграничение многих понятий и терминов, которые в других документах по Фортрану обычно остаются неопределенными. Хорошо определенная терминология позволяет верить, что стандарт Фортран 77 будет полезен независимо от дальнейшей эволюции идей программирования.
20 /. Введение 1.4.1. Последовательность Последовательность — это множество элементов, упорядоченное путем установления взаимно однозначного соответствия с числами 1, 2, . . ., я. Последовательность может быть пустой, т. е. не содержать ни одного элемента. В непустой последовательности имеются первый и последний элементы, число элементов последовательности равно п. При описании языка Фортран 77 понятие последовательности используется в самых разнообразных контекстах. Например, программа — это последовательность инструкций. Аналогично массив — это непустая последовательность элементов данных, текстовый элемент данных — это непустая последовательность литер. 1.4.2. Список Список — это непустая последовательность синтаксических элементов, разделенных запятыми. Примеры списков в Форт* ране: 1. Спецификации форматов в инструкции FORMAT 2. Имена переменных в инструкции DATA 3. Описатели размеров в декларации массива 4. Управляющие спецификации в инструкции ввода или вывода Синтаксические элементы в списке называются членами списка. 1.4.3. Отрезки памяти и единицы памяти Понятие отрезка памяти вводится для того, чтобы иметь возможность описывать способы хранения данных в памяти, не прибегая при этом к неявным ссылкам на тот или иной конкретный вид памяти. Отрезок памяти — это последовательность единиц памяти. Единица памяти — это объем памяти, необходимый для хранения элемента данных определенного класса. Различают числовые единицы памяти и текстовые единицы памяти. В числовой единице памяти может храниться (запоминаться) элемент данных целого, вещественного или логического типа. Для хранения (запоминания) элемента данных комплексного типа или двойной точности необходимы две числовые единицы памяти в отрезке памяти. В текстовой единице памяти может храниться (запоминаться) одна литера некоторого текстового элемента данных. Таким образом, для каждой литеры текстового элемента данных не-
1.4. Основные понятия языка Фортран 77 и терминология 21 обходима одна текстовая единица памяти. Если объект данных целого, вещественного, логического типа, двойной точности, комплексного или текстового типа требует более одной единицы памяти в отрезке памяти, то соответствующие единицы памяти должны располагаться последовательно. Никаких отношений между числовыми и текстовыми единицами памяти не устанавливается. 1.4.4. Ассоциирование Ассоциированием называется идентификация одного и того же объекта в программной компоненте или в исполняемой программе при помощи различных имен. Как правило, ассоциирование относится к элементам данных. Та или иная форма ассоциирования определяется как результат одного или нескольких из следующих процессов: 1. Ассоциирование путем использования общей памяти 2. Ассоциирование, или совмещение элементов данных, путем установления эквивалентности при помощи инструкции EQUIVALENCE 3. Ассоциирование параметров при обращении к подпрограммам 4. Ассоциирование входов в функциях с несколькими входными точками Смысл ассоциирования, или совмещения, состоит в том, что на объект, описанный в какой-то части программы или в программной компоненте, можно ссылаться при помощи другого объекта того же типа. 1.4.5. Статус определенности При выполнении программы на языке Фортран 77 в любой момент времени каждая переменная, массив или подцепочка имеет «статус определенности», т. е. находится в одном из состояний «определен» или «неопределен». Если объект определен, то он имеет некоторое значение, которое не изменится до тех пор, пока объект либо не будет переопределен при помощи другого значения, либо не станет неопределенным. В тот момент, когда выбирается значение объекта, он должен быть определен, поскольку неопределенный объект имеет непредсказуемое значение. Таким образом, объект должен быть определен до момента выбора значения и не должен стать неопределенным с момента последнего определения до выбора значения. Объект является предварительно определенным, если в инструкции DATA задано его значение: такой объект опре-
22 1. Введение делен с начала выполнения программы. Объект может стать определенным и в результате ассоциирования с объектом, который был определен. Случаи, когда объект становится определенным или неопределенным, описываются по мере введения новых типов объектов. 1.4.6. Выбор значения объекта и обращение к процедуре в Фортране 77 Термин «выбор значения», или «ссылка», относится к переменным, массивам и подцепочкам, а «обращение»— к процедурам. Выбором значения переменной, массива или подцепочки называется появление этого объекта в такой инструкции, при выполнении которой используется значение объекта. При выборе значения переменной, массива, подцепочки значение объекта доступно для использования, но оно не меняется. Процесс определения объекта, т. е. присваивание ему значения, не относится к понятию выбора значения или ссылки. Обращением к процедуре называется появление имени процедуры в такой инструкции, для выполнения которой требуется выполнить действия, описываемые процедурой. Процедура должна быть доступна в момент обращения к ней из исполняемой программы. 1.4.7. Процессор Процессором называется вычислительная машина. Однако этот термин означает нечто большее, чем система обработки данных. В контексте этой книги термин «процессор» будет означать вычислительную машину с теми средствами, при помощи которых программа на Фортране будет транслироваться или интерпретироваться для выполнения на этой машине. Таким образом, процессор — это ЭВМ плюс компилятор Фортрана 77 или ЭВМ. плюс интерпретатор Фортрана 77.
2 ХАРАКТЕРИСТИКА ЯЗЫКА ФОРТРАН 77 2.1. СОДЕРЖАНИЕ ГЛАВЫ Эта глава содержит обзор различного рода элементов, из которых состоит программа на языке Фортран 77. В целом Фортран 77 характеризуется теми же основными чертами, что и Фортран стандарта 1966 г., поэтому читатель, знакомый со старым стандартом, может перейти сразу к третьей главе. 2.2. АЛФАВИТ Алфавит языка Фортран 77 состоит из букв, цифр и специальных литер. На множестве литер алфавита определено отношение следования; особым правилам подчинено использование пробела. 2.2.1. Буквы и цифры Слово буква имеет обычный смысл, буквами являются следующие 26 литер: ABCDEFGHIJKLMNOPQRSTUVWXYZ Понятие цифра также определяется обычным образом, цифрами являются следующие 10 литер: 0123456789 В представлениях чисел цифры интерпретируются как десятичные. Буквы и цифры вместе составляют алфавитно-цифровой набор литер. 2.2.2. Специальные литеры Алфавит языка Фортран 77 включает следующие 13 специальных литер:
24 2. Характеристика языка Фортран 77 Литера (не имеет графического представления) + — * / с ) > , $ > • Название литеры Пробел Равенство Плюс Минус Звездочка Наклонная черта Левая скобка Правая скобка Запятая Десятичная точка Знак доллара Кавычка Двоеточие Другие специальные литеры также могут использоваться в программе на Фортране 77 или в качестве данных. Специальные литеры, отличные от указанных выше, могут встречаться только в текстовых литералах, холлеритовских константах или в комментариях. Смысл специальной литеры процессор определяет в зависимости от контекста, в котором она используется. Специальная литера может быть, например, знаком операции, литерой в текстовом литерале, входить в числовую константу или использоваться для других целей в языке Фортран 77. 2.2.3. Отношение следования Отношение следования — это отношение на множестве литер, которое позволяет упорядочивать текстовые цепочки. Отношение следования для букв и для цифр задано выше: буква А предшествует букве Z, цифра 0 предшествует цифре 9. Буквы и цифры не должны следовать вперемешку: либо все цифры предшествуют всем буквам, либо все цифры следуют за всеми буквами. Пробел предшествует букве А и цифре 0. Отношение следования для специальных литер не устанавливается, не оговаривается также их положение относительно других литер алфавита.
2.3. Идентификаторы 25 2.2.4. Пробелы Пробел является незначащей литерой в инструкциях Фортрана 77 и учитывается только в текстовых литералах и холлери- товских константах; в остальных случаях пробелы можно использовать без ограничений для улучшения внешнего вида программы. Особым образом используется пробел для обеспечения необходимого формата инструкции в Фортране 77, эти случаи описываются в соответствующих разделах книги. Например, колонки 1—5 начальной строки инструкции в Фортране 77 должны содержать либо метку, либо только пробелы. 2.3. ИДЕНТИФИКАТОРЫ Имя — это последовательность литер, которая имеет определенный смысл с точки зрения программиста; ключевые слова имеют определенный смысл для процессора и используются для идентификации инструкций Фортрана 77 или в качестве разделителей. Имена и ключевые слова вместе называются идентификаторами. 2.3.1. Имена Имя — это последовательность литер, которой программист обозначает такие объекты своей программы, как переменная, массив, программная компонента, помеченный общий блок. Имя должно содержать от 1 до 6 букв или цифр и начинаться с буквы. Синтаксическая диаграмма для имен: имя: буква ч цифра ^Т^-ч 2.3.2. Ключевые слова Ключевое слово — это последовательность литер, имеющая определенный смысл в языке Фортран 77 и понятная процессору. Ключевые слова используются либо для идентификации инструкций в языке Фортран 77, либо в качестве разделителей внутри инструкций. Типичными примерами ключевых слов, идентифицирующих инструкцию, являются слова REAL, FORMAT и READ. Два примера разделителей — слова ТО и THEN. Е
к 26 2. Характеристика языка Фортран 77 В Фортране 77 не существует зарезервированных слов, поэтому имя может по написанию полностью совпадать с ключевым словом. Процессор определяет смысл последовательности литер в зависимости от контекста, в котором она встретилась. 2.4. СТРУКТУРА ИНСТРУКЦИИ Программная компонента в языке Фортран 77, например главная программа или подпрограмма, представляет собой совокупность строк, упорядоченную в той последовательности, в которой строки предстают перед процессором. Строка состоит из 72 текстовых позиций, перенумерованных последовательно слева направо числами от 1 до 72 и называемых колонками. Различаются строки комментариев, начальные строки и строки продолжения. 2.4.1. Строки комментариев Строка комментария определяется по одному из следующих признаков: 1. В первой колонке стоит буква С. 2. В первой колонке стоит звездочка. 3. Строка состоит из одних пробелов. Если носитель, с которого вводится программа, имеет более 72 колонок, как, например, 80- или 96-колоночные перфокарты, то комментарий данного типа распознается по пробелам в колонках с 1-й по 72-ю. Строки комментариев с буквой С или звездочкой в колонке 1 могут содержать произвольную последовательность литер в колонках с 2-й по 72-ю. Строки комментариев могут располагаться в любом месте программной компоненты, и они никоим образом не влияют на поведение исполняемой программы. Одна или более строк комментариев могут быть помещены перед первой строкой программной компоненты, между двумя инструкциями Фортрана 77, между начальной строкой и первой строкой продолжения или между двумя строками продолжения. 2.4.2. Начальная строка Первая и, возможно, единственная строка, в которой располагается инструкция языка Фортран 77, называется начальной строкой. Колонки с первой по пятую начальной строки должны содержать либо только пробелы, либо метку инструкции. Колонка 6 должна быть либо пустой, либо содержать цифру 0. Инструкция языка Фортран 77 или ее часть размещается в ко-
2,4. Структура инструкции 27 лонках с 7-й по 72-ю. Оставшиеся колонки, если таковые имеются, могут быть либо пустыми, либо могут служить для идентификации и содержать порядковый номер инструкции. 2.4.3. Строки продолжения Строка продолжения содержит продолжение инструкции языка Фортран 77 и имеет следующие признаки: 1. Колонки с 1-й по 5-ю должны содержать пробелы. 2. Колонка 6 содержит литеру, отличную от нуля и пробела. Колонка 6 часто используется для нумерации строк продолжения. Колонки с 7-й по 72-ю в строке продолжения, так же как и в начальной строке, содержат некоторую часть инструкции языка Фортран 77, а остальные колонки, если таковые имеются, могут быть либо пустыми, либо могут использоваться для идентификации и содержать порядковый номер инструкции. 2.4.4. Пустые строки Как указывалось выше, строка, содержащая пробелы в колонках с 1-й по 72-ю, является строкой комментария. В стандарте Фортран 77 не рассматриваются отдельно случаи, когда начальная строка с меткой или строка продолжения содержит в колонках с 7-й по 72-ю только пробелы. По умолчанию эти два случая удовлетворяют определениям соответственно начальной строки и строки продолжения, поэтому разумно будет рассматривать их как допустимые разновидности соответственно начальной строки и строки продолжения. 2.4.5. Инструкции языка Фортран 77 Инструкция языка Фортран 77, обрабатываемая процессором, располагается в колонках с 7-й по 72-ю начальной строки и в строках продолжения, которых не должно быть более 19. Таким образом, инструкция языка Фортран 77 может иметь длину до 1320, т. е. 20x66, литер. Но в это максимальное число входят также пробелы, которые могут встречаться в записи инструкций и игнорируются процессором. Каждая инструкция языка Фортран 77 должна начинаться с новой начальной строки, если только она не входит в состав логической инструкции IF, структура которой всегда включает некоторую инструкцию Фортрана 77. Инструкция END обозначает конец программной компоненты на Фортране 77, поэтому начальная строка для другой инструкции может содержать в колонках с 7-й по 72-ю только сочетание букв END и ничего более.
ь 28 2. Характеристика языка Фортран 77 2.4.6. Метки Метки (номера инструкций), фигурирующие в документе по стандарту Фортран 77 под названием «метки инструкций», являются средством отметить какую-либо инструкцию языка Фортран 77 с тем, чтобы на нее можно было сослаться в некоторой другой инструкции языка Фортран 77. Метка помещается в колонки с 1-й по 5-ю начальной строки и содержит от 1 до 5 цифр, из которых по крайней мере одна должна отличаться от нуля. Синтаксическая диаграмма метки имеет вид: метка: h цифра- Метка должна содержать цифру, отличную от нуля Метка может располагаться в любых колонках с номерами от 1 до 5. Пробелы и старшие нули игнорируются при определении значения метки. Областью действия метки является программная компонента, в которой встретилась метка; нельзя отмечать метками, имеющими одинаковое значение, несколько инструкций. В инструкции языка Фортран 77 метка необязательна. Но только на инструкцию с меткой можно сослаться в какой-либо другой инструкции Фортрана 77. Инструкция может быть помечена, даже если на нее нет ссылок; пометить можно любую инструкцию, можно пометить все инструкции. 2.4.7. Форма инструкции в Фортране 77 Все инструкции в Фортране, за исключением инструкции присваивания и функции-формулы, начинаются с ключевого слова. При помощи ключевого слова процессор распознает тип инструкции. Приведем несколько примеров: Инструкция Пояснение REAL APPLE(50),BLIST(3,75) Ключевое слово REAL GOTO 400 Ключевое слово GOTO IF (R**2—X .LT. EPS) Ключевые слова IF и RETURN RETURN R = .5 *(X/R + R) Ключевого слова нет; это инструкция присваивания
2,5. Организация программы 29 Функция-формула, которая будет рассмотрена ниже, является определением внутренней функции и имеет структуру, подобную структуре инструкции присваивания. 2.5. ОРГАНИЗАЦИЯ ПРОГРАММЫ Инструкции в Фортране 77 группируются в программные компоненты; исполняемая программа составляется из одной или нескольких программных компонент. Для полного понимания данного раздела, как и многих других разделов книги, необходимо иметь некоторое представление о языке Фортран. Но читатель может вернуться к этому разделу и позже, прочитав остальные главы книги. 2.5Л. Программная компонента Программная компонента — это либо главная программа, либо подпрограмма. Рамками программной компоненты ограничивается область действия имен и меток, так что процессор, обрабатывая одну программную компоненту, ничего не будет знать об объектах, явно или неявно описанных в другой программной компоненте, если только это не предусмотрено явно. Программная компонента представляет собой последовательность инструкций языка Фортран 77 и, возможно, комментариев. Программная компонента всегда заканчивается инструкцией END. 2.5.2. Главная программа Главная программа — это программная компонента, которой передается управление, когда процессор начинает выполнять исполняемую программу. Главная программа отличается от других программных компонент либо тем, что она начинается инструкцией PROGRAM, либо тем, что она начинается с инструкции, отличной от FUNCTION, SUBROUTINE или BLOCK DATA. 2.5.3. Подпрограммы Подпрограмма — это программная компонента, которой передается управление процессором, когда в главной программе или в другой подпрограмме встречается инструкция, содержащая обращение, или вызов данной подпрограммы. Подпрограмма распознается по первой инструкции, которая должна быть инструкцией FUNCTION или SUBROUTINE. Инструкции FUNCTION и SUBROUTINE описывают соответственно подпрограмму-функцию и подпрограмму.
30 2. Характеристика языка Фортран 77 2.5.4. Процедуры Сегмент программы, выполняющий некоторое действие в общем смысле, называется процедурой. В Фортране 77 различаются три вида процедур: внешние процедуры, функции-формулы и стандартные функции. Внешняя процедура — это функция или подпрограмма, а слово «внешняя» означает, что программная компонента обрабатывается (т. е. компилируется или интерпретируется) независимо от программных компонент, в которых есть обращения к ней. Функция-формула — это одна инструкция, содержащая описание функции, которое обрабатывается в рамках программной компоненты, где встретилась эта инструкция. Стандартная функция — это подпрограмма вычисления некоторой функции, например квадратного корня или синуса, которая определяется как составная часть языка Фортран 77. Внешняя процедура может быть написана необязательно на Фортране. Данное определение допускает обращения из программных компонент, написанных на Фортране, к подпрограммам, написанным на языке ассемблера или на других языках более высокого уровня. 2.5.5. Программные компоненты BLOCK DATA Программную компоненту, первой инструкцией которой является инструкция BLOCK DATA, называют обычно «подпрограммой данных». Подпрограмма данных не может содержать исполняемых инструкций и служит для инициализации общей памяти. 2.5.6. Исполняемая программа Исполняемая программа состоит из главной программы и нескольких (возможно ни одной) внешних процедур и подпрограмм данных. Исполняемая программа не может содержать более одной главной программы, но может содержать по одной или более компонент следующих видов: 1. Функция 2. Подпрограмма 3. Подпрограмма данных 4. Внешняя процедура нефортранного происхождения Главная программа исполняемой программы не может содержать инструкций ENTRY или RETURN, выполнение программы заканчивается, если в какой-нибудь программной компоненте
2.5. Организация программы 31 выполнится инструкция STOP или если выполнится инструкция END в главной программе. Вопросы, относящиеся к выполнению программы на Фортране, рассматриваются в одном из последующих разделов. 2.5.7. Порядок инструкций в программной компоненте В табл. 2.1 указан порядок, в котором могут располагаться инструкции в программной компоненте. Вертикальными линиями отделяются инструкции, взаимное расположение которых может быть произвольным. Горизонтальными линиями отделяются классы инструкций, которые нельзя перемешивать. Например: 1. Строки комментариев можно помещать в любом месте программы, но до инструкции END. 2. Инструкция PROGRAM, FUNCTION, SUBROUTINE или BLOCK DATA должна быть первой инструкцией программной компоненты. 3. Инструкции PARAMETER могут перемежаться с инструкциями IMPLICIT и другими инструкциями описания, но должны предшествовать инструкциям DATA. 4. Функции-формулы должны располагаться раньше всех исполняемых инструкций. Таблица 2.1 Допустимый Строки комментариев порядок инструкций и строк комментариев в программе на Фортране 77 Инструкция PROGRAM, FUNCTION, SUBROUTINE или BLOCK DATA Инструкции FORMAT и ENTRY Инструкции PARAMETER Инструкции DATA Инструкции IMPLICIT Другие инструкции описания Функции-формулы Исполняемые инструкции Инструкция END
32 2. Характеристика языка Фортран 77 Таблицу 2.1 дополняют следующие правила: 1. Инструкция FORMAT может помещаться в любом месте программной компоненты. 2. Инструкция ENTRY может помещаться в любом месте программной компоненты, но не в теле цикла и не в промежутке между инструкцией IF структурная и соответствующей инструкцией END IF. 3. Все описательные инструкции (т. е. инструкции IMPLICIT и другие инструкции описания) должны помещаться раньше ,. инструкций DATA, функций-формул и исполняемых инструкций. ! 4. Все функции-формулы должны предшествовать первой * исполняемой инструкции. | 5. Инструкции DATA можно размещать где угодно, но после * всех инструкций PARAMETER, IMPLICIT и других инструкций . описания. 6. Инструкции IMPLICIT должны предшествовать всем дру- * гим инструкциям описания, за исключением инструкций PARA- - METER. 7. Инструкция описания (т. е. инструкция IMPLICIT или другая инструкция описания), содержащая описание типа для , имени, которое будет использовано как имя параметра, должна располагаться раньше инструкции PARAMETER, содержащей, описание этого параметра. 8. Инструкция PARAMETER, содержащая описание некоторого параметра, должна располагаться раньше всех инструк- I ций, в которых встречается (используется) имя этого параметра. I Можно сделать ряд очевидных наблюдений. Строка комментария I может предшествовать инструкции PROGRAM, FUNCTION, I SUBROUTINE или BLOCK DATA, но не может следовать за I инструкцией END. Инструкция DATA может располагаться в I любом месте ниже инструкций описания, поскольку указанные! в ней значения присваиваются переменным перед началом вы-| полнения программной компоненты. I Данные правила применимы лишь к тем программным ком-| понентам, в которых допускаются и реально используются ин-| струкции указанных видов.
3 ТИПЫ ДАННЫХ И КОНСТАНТЫ 3.1. ТИПЫ ДАННЫХ В Фортране 77 допускаются явно шесть типов данных: Целый Вещественный Двойной точности Комплексный Логический Текстовый Кроме того, в инструкциях FORMAT можно использовать хол- леритовский тип данных. Типом обладают объекты трех видов: константы, имена данных и процедуры. Тип константы определяется способом ее написания. Тип имени данных определяется либо явно в инструкции описания типа, либо неявно одним из следующих способов: 1. По первой букве идентификатора. Если первая буква — одна из букв I,J,K,L,M или N, то тип — целый. В противном случае тип вещественный. 2. С помощью инструкции IMPLICIT, которая изменяет правило неявного определения типа по умолчанию. Тип определяется неявно лишь в тех случаях, когда отсутствует явное описание типа. Имя данных служит для обозначения переменной, массива или параметра. Параметр — это константа, которой при помощи инструкции PARAMETER присвоено имя. Тип могут иметь процедуры трех видов: внешняя функция, ! функция-формула и стандартная функция. Типом внешней | функции или функции-формулы определяется тип элемента , данных, получающегося в результате обращения к функции в каком-либо выражении. Тип внешней функции или функции- формулы определяется типом ее имени, который может быть описан либо явно в инструкции описания типа, либо неявно по первой букве имени, если нет явного описания типа. Так же, как имена данных, имена функций, начинающиеся с букв I,J,K, L,M или N, по умолчанию имеют целый тип. Имена, начинающиеся с других букв, по умолчанию имеют вещественный тип. 2 Г. Катцан
34 3. Типы данных и константы Для того чтобы изменить это правило определения типов по умолчанию, можно воспользоваться инструкцией IMPLICIT. Явное описание типа внешней функции может содержаться также в инструкции FUNCTION; при определении типа внешней функции может сыграть роль инструкция IMPLICIT, имеющаяся в этой функции. Стандартные функции имеют универсальные имена, которые не требуют ни явного, ни неявного определения типа. Тип стандартной функции определяется типом ее аргументов. Процессор Фортрана 77 обеспечивает обращение к подходящей программе для вычисления функции. Тип стандартной функции описывать необязательно, тем не менее явное описание ее типа допускается. В целом понятие типа применимо к тем значениям, которые могут использоваться в выражениях Фортрана 77, т. е. к кон- стацтам, именам данных и к обсуждавшимся выше функциям. Исходя из этого, не имеет смысла говорить о типе имен, идентифицирующих главную программу, подпрограммы, общие блоки, подпрограммы данных, и такие имена не соотносят с каким- либо типом. Метка в языке Фортран 77 — это уникальная целая положительная константа, но и в этом случае понятие типа не имеет смысла. 3.2. КОНСТАНТЫ И ЗНАЧЕНИЯ Константа — это некоторое значение, которое не изменяется в процессе выполнения программы. Константа в Фортране 77 может принадлежать к арифметическому, логическому или текстовому типу. Значение — это элемент данных, связанный с переменной, элементом массива, обращением к функции или выражением, которые могут встретиться в процессе выполнения программы на Фортране 77. Например, переменная может быть определена или не определена. Значением определенной переменной является элемент данных, который был ей присвоен в результате выполнения инструкции присваивания или инструкции ввода. Способ написания константы (ее внешний вид) определяет и ее значение, и ее тип. При помощи инструкций PARAMETER константе можно присвоить имя, но имя одной константы нельзя использовать при формировании другой константы. Встречающиеся внутри констант пробелы игнорируются процессором и не влияют на значения констант, за исключением текстовых констант, заключаемых в кавычки. Арифметическая константа может быть одного из четырех типов: целого, вещественного, двойной точности и комплексного. Арифметическая константа может быть со знаком или без знака. Константа со знаком имеет в начале знак плюс или минус и
3.3. Данные целого типа 35 обозначает соответственно положительное или отрицатель число. Константа без знака не имеет знака в начале и обозная чает положительное число. Константа с возможным знаком может быть без знака или со знаком. Константы с возможным знаком могут быть двойной точности, целого и вещественного типов. Синтаксические диаграммы для констант Фортрана 77 изображены на рис. 3.1. 3.3. ДАННЫЕ ЦЕЛОГО ТИПА Элемент данных целого тип! есть точное представление некоторого целого числа. Объектом целого типа в Фортране 77 может быть константа, параметр, целая переменная, элемент целого массива, результат обращения к функции или значение выражения. Элемент данных целого типа занимает одну числовую единицу памяти в отрезке памяти и может принимать положительное, отрицательное или нулевое значение. Целая константа может обозначать положительное, отрицательное или нулевое значение и записывается в виде знака, который может отсутствовать, и цепочки десятичных цифр, воспринимаемой как десятичное число. Форма записи целой константы описывается синтаксической диаграммой на рис. 3.1. Ниже приведены примеры правильной и неправильной записи целых констант: Правильная запись Неправильная запись целых констант целых к констант О 54. (содержит десятич- 75 ную точку) + 230 3,216,193 (содержит запятые) — 9342605 —2.236 (содержит десятичную точку и дробную часть) Максимальная величина элемента данных целого типа определяется размером числовой единицы памяти. 3.4. ВЕЩЕСТВЕННЫЕ ДАННЫЕ Элемент данных вещественного типа — это приближение некоторого вещественного числа, зависящее от способа представления данных этого типа в процессоре х). Объектом вещественного Х) Как правило, применяется представление вещественных данных в виде чисел с плавающей точкой, аналогичное представлению, используемому в научной литературе. Вещественное значение состоит из алгебраического знака, 2*
36 3. Типы данных и константы типа в Фортране 77 могут быть константа, параметр, вещественная переменная, элемент вещественного массива, результат обращения к функции или значение выражения. Элемент данных вещественного типа занимает в отрезке памяти одну числовую единицу памяти и может принимать положительное, отрицательное или нулевое значения. константа: -знак _L ар№рметическа*_кон£гантг£_без _знака текстовая ..константа -логическая_ константа ■ Ч арифметическая константа без знака: —целая_констакта_без_знака —— — вещ_констакта_без„.знака — константа_ дв _точн_без_знака— — компяексная^константа- ■ целая _константа_без_знака: ——— Ненулевая_целая _константа_ без_знака: целая_константа: __ с ^ j цифра —ч Яеяулевая целая константа без знака должна содержать цифру\ отличную от нуля. вещ _константа_6ез_знака: t ■иелая^константаибез.зяака -у-.-т-^Щ iWWjf6flcraBTaj6e5e9flaKa"^\ • Е целая_коястаята- Рис. 3.1. Синтаксические диаграммы для констант Фортрана 77. мантиссы и порядка. Например, число —51,234 можно представить в десятичной системе счисления как —.51234Х 102. Мантисса числа с плавающей точкой задает точность представления, а показатель степени задает порядок числа. Тот факт, что вещественное число представляется вещественным элементом данных приближенно, вытекает из особенностей машинной арифметики с плавающей точкой и выбором системы счисления (двоичной, десятичной и др.) для представления порядка и мантиссы.
,гонстанта.лв_точн_без_ знака: i целая _константа_без_знака- :з целая_ константа_6ез _зна! D целая_константа комплексная константа: t v— ( —/ \ jr^r вещ_константа_оез_знака т- ^— знак ——' ^-целая константа Лез знака ' целая_константа_без_знака- > —-—*— 1ака-^ ч логическая, константа: t.TRUE. ч .FALSE.—1 тепловая „.константа: ■ Т. литера_не_кавычка- кавычка кавычка — 1 ' ■■ ' " кавычка Кавычка в текстовой константе представляется в виде двух подряд стоящих кавычек без пробелов между ними литера_алфавита: г кавычка: ' . • литера_не_кавычка : знак: • "П tl -цифра! • буква: mi и i mi) 0Т23456789 LLLLLLLLLL 1ГШТТГТПТПТГПТТПТШ ABCDEFGHIJKLMNQP'QRSTUVWXYZ шшшшшж. тгптпт 11111UI LL Пробел является литерой алфавита. Б'алфавит могут сходить также другие литеры, распознаваемые процессором. 3.1. Синтаксические диаграммы для констант Фортрана 77 (продолже-
38 3. Типы данных и константы Вещественная константа может обозначать положительное, отрицательное или нулевое значения и записывается в одной из трех форм: 1. гэазовая вещественная константа 2. Базовая вещественная константа с порядком вещественного числа. 3. Целая константа с порядком вещественного числа. Базовая вещественная константа состоит из знака, который может отсутствовать, и цепочки десятичных цифр с десятичной точкой. Целая константа была определена ранее. Порядок вещественного числа состоит из буквы Е и целой константы со знаком или без знака, обозначающей показатель степени числа 10, на которую умножается константа. Значением вещественной константы является значение базовой вещественной константы, а если присутствует порядок, то значение базовой вещественной или целой константы умножается на степень числа 10, показатель которой записан после буквы Е. Вещественная константа воспринимается как десятичное число. Форма записи вещественной константы задается синтаксической диаграммой на рис. 3.1. Ниже приведены примеры правильной и неправильной записи вещественных констант: Правильная запись вещественных констант — 1.5 ЗЕ5 + .123Е-3 — 7.45Е-14 5. — 6389.1 Е21 1.23Е0 Неправильная запись вещественных констант 5 1,234.5 .123-3 -6.1Е Значения констант -1.5 + 300000 (т. е. ЗхЮ5) +.000123 — 7.45хЮ-14 +5 —6389.1 хЮ21 + 1.23 (т. е. 1.23x10°) Пояснения Нет ни точки, ни порядка Содержит запятую Отсутствует обозначение порядка Е Отсутствует целая константа после буквы Е
S.5. Данные двойней точности 39 1.23456D50 Неправильное обозначение порядка для вещественной константы (Но это правильная запись константы двойной точности.) Максимальная величина и точность вещественной константы определяются размером числовой единицы памяти и способом представления чисел в машине. Целая часть вещественной константы может содержать цифр больше, чем это позволяет точность приближения для соответствующего вещественного числа, свойственная данному процессору. 3.5. ДАННЫЕ ДВОЙНОЙ ТОЧНОСТИ Элемент данных двойной точности есть некоторое приближение вещественного числа, зависящее, как и для вещественного типа, от способа представления данных в процессоре. Различие между вещественными данными и данными двойной точности состоит в том, что элемент данных двойной точности содержит больше значащих цифр, чем элемент данных вещественного типа. К данным типа двойной точности в Фортране 77 могут относиться константа, параметр, переменная двойной точности, элемент массива двойной точности, результат обращения к функции и значение выражения. Элемент данных двойной точности занимает две числовые единицы памяти в отрезке памяти и может принимать положительное, отрицательное или нулевое значение. Константа двойной точности - может обозначать положительное, отрицательное или нулевое значение и записывается в одной из двух форм: 1. Базовая вещественная константа, за которой следует порядок числа двойной точности. 2. Целая константа, за которой следует порядок числа двойной точности. Базовая вещественная и целая константы были определены ранее. Порядок числа двойной точности состоит из буквы D и целой константы со знаком или без знака, содержащей одну или две цифры и обозначающей показатель степени числа 10, на которую умножается константа. Значение константы двойной точности равно значению базовой вещественной или целой константы, умноженному на степень числа 10, показатель которой записан после буквы D.
40 3. Типы данных и константы Константа двойной точности воспринимается как десятичное число. Форма записи констант двойной точности задается синтаксической диаграммой на рис. 3.1. Ниже приведены примеры правильной и неправильной записи констант двойной точности: Правильная запись констант двойной точности 1D2 .123456789101112D0 6.89D —8 — 4.D+16 Неправильная запись констант двойной точности — 1.2345678910 Л23456789101112Е0 .123,456,789D5 .123'456789D5 7.8912D Значения констант + 100 +.123456789101112 + 6.89хЮ-8 — 4хЮ1в Пояснения Отсутствует обозначение порядка Неправильное обозначение порядка Встречаются запятые Встречаются кавычки После буквы D нет целой константы Максимальная величина и точность константы двойной точности определяются размером числовой единицы памяти и способом представления данных двойной точности. Целая часть константы двойной точности может содержать цифр больше, чем позволяет точность приближения соответствующего вещественного числа в процессоре. 3.6. КОМПЛЕКСНЫЕ ДАННЫЕ Элемент данных комплексного типа есть приближение некоторого комплексного числа/ зависящее от способа представления вещественных данных в процессоре. Объектом комплексного типа в Фортране 77 могут быть константа, параметр, комплексная переменная, элемент комплексного массива, результат обращения к функции и значение выражения. Элемент данных комплексного типа занимает две подряд стоящие единицы памяти
3J. Логические данные 41 в отрезке памяти, представляющие пару значений вещественного типа. Первая компонента пары представляет действительную часть, а вторая — мнимую часть элемента данных комплексного типа. Действительная и мнимая компоненты комплексного элемента данных могут принимать положительные, отрицательные и нулевые значения. Комплексная константа представляет собой пару вещественных или целых констант, разделенных запятыми и заключенных в скобки. Первая константа этой пары обозначает действительную часть, а вторая — мнимую часть константы. Каждая из двух целых или вещественных констант может быть положительной, отрицательной или нулевой. Форма записи комплексной константы дана на синтаксической диаграмме рис. 3.1. Ниже приведены примеры правильной и неправильной записи комплексных констант: Правильная запись Значения комплексных констант (4.61,-6.81) 4.61—6.811 (—10,5) — 10 + 5i (.4Е2,—.31Е-1) 40 —0.03U Неправильная запись Пояснения комплексных констант (9, 1.231) Неправильно записана вторая константа (2ЕЗ, 4D5) Константа двойной точности Комплексная константа всегда хранится в виде пары вещественных значений, а максимальная величина и точность вещественных констант определяются указанными выше условиями для вещественных данных. Действительная и мнимая компоненты комплексной константы должны удовлетворять приведенным ранее правилам записи вещественных или целых констант. 3.7. ЛОГИЧЕСКИЕ ДАННЫЕ Элемент данных логического типа может использоваться для обозначения одного из значений: «истина» или «ложь». Объектом логического типа в Фортране 77 может быть константа, параметр, логическая переменная, элемент логического массива, результат обращения к функции и значение выражения. Элемент дан-
42 3. Типы данных и константы ных логического типа занимает в отрезке памяти одну числовую единицу памяти. Логическая константа может задавать значение «истина» или «ложь» следующим образом: Логическая Логическое значение константа .TRUE. Истина .FALSE. Ложь Слова TRUE и FALSE должны быть окружены точками. Форма записи логических констант дана на синтаксической диаграмме рис. 3.1. 3.8. ТЕКСТОВЫЕ ДАННЫЕ Элемент данных текстового типа представляет собой цепочку из одной или более литер. Объектом текстового типа в Фортране 77 может быть константа, параметр, текстовая переменная, элемент текстового массива, результат обращения к функции и значение выражения. Каждая литера текстового элемента данных занимает одну текстовую единицу памяти в отрезке памяти; смежные литеры текстового элемента данных занимают соответственно смежные единицы памяти в отрезке памяти. Литеры, входящие в состав текстового элемента данных, перенумерованы последовательно слева направо целыми числами, начиная с 1, причем в цепочке может быть представлена любая литера алфавита процессора, включая пробел и кавычку, которая служит также разделителем. Длина текстового элемента данных равна числу литер в константе или в отрезке памяти, в котором хранится этот элемент данных. Текстовая константа представляет собой последовательность литер, заключенную в кавычки. Кавычки служат признаками начала и конца константы и не являются ее частью, а все литеры между кавычками входят в состав константы. Кавычка в текстовой константе представляется в виде пары подряд стоящих кавычек, не разделенных пробелами. Форма записи текстовой константы дана на синтаксической диаграмме рис. 3.1. Ниже приведены примеры правильной и неправильной записи текстовых констант: Правильная запись текстовых констант Длина Значение
3.9. Холлеритовские данные 43 Неправильная запись текстовых констант 5HTITLE "TEA FOR TWO" 'ALL RIGHT Пояснение He заключена в кавычки Не заключена в кавычки Нет кавычки справа Текстовая константа не может иметь нулевую длину Длина текстовой константы должна быть больше нуля. 3.9. ХОЛЛЕРИТОВСКИЕ ДАННЫЕ Холлеритовский тип данных определяется в языке Фортран 77 для совместимости с существующими системами. Область применения этого типа ограничена: допускаются лишь константы холлеритовского типа, но и они могут использоваться только в ряде специально оговоренных случаев. Холлеритовская константа представляет собой последовательность литер вида пНххх...х п литер где п — ненулевая целая константа без знака, а буквами х обозначены литеры из алфавита процессора. Длина холлеритов- ской константы равна п, значение константы состоит из п литеру стоящих после буквы Н. Ниже приведены примеры правильной записи холлеритовских констант: Правильная запись холлеритовских констант 11HTEAFORTWO 5HDONT 10HALL, RIGHT Длима 11 iTlElAl iDlOlNl Значение iFlOlRl 'ITI ItIwIoI 10 |A[L|L|,1 |R|I|G|H|T Длина холлеритовской константы всегда равна п — значению целой ненулевой константы без знака, стоящей перед буквой Н. В программе на Фортране 77 холлеритовская константа может встречаться только в инструкции DATA, в списке аргументов в инструкции CALL и в инструкции FORMAT.
44 3. Типы данных и константы Холлеритовская константа может храниться как значение целой, логической или вещественной переменной. Если переменной присваивается холлеритовское значение, то она становится неопределенной как арифметическая или логическая переменная. Холлеритовское значение можно присвоить переменной при помощи инструкции DATA, например: INTEGER ANAME DATA ANAME/4HJOHN/ или при помощи инструкции READ, например: LOGICAL BIG READ(5,9000)BIG 9000 FORMAT(A4) Способ выполнения присваивания холлеритовских значений в Фортране 77 зависит от числа литер, которые можно поместить в одну числовую единицу памяти. Обозначим это число через len. Пусть число литер в элементе данных холлеритовского типа равно п. Если п>1еп, то записываются правые len литер холлеритовского значения. Если n<Sen, то холлеритовский элемент данных при записи дополняется справа len — п пробелами. Использование холлеритовских данных в спецификации формата и в списке аргументов в операторе CALL рассматривается в соответствующих разделах книги. Использование холлеритовских данных со спецификацией преобразования А в инструкции FORMAT рассматривается вместе с другими спецификациями преобразования.
4 СТРУКТУРЫ ДАННЫХ 4.1. ПЕРЕМЕННЫЕ Переменная — это объект, обладающий следующими атрибутами: 1. Имя 2. Тип 3. Значение Имя переменной должно удовлетворять приведенным ранее правилам составления имен и фиксируется как имя переменной либо если оно упоминается в инструкции описания типа, либо если оно определяется где-либо в программе. Тип переменной устанавливается явно или неявно, как указывалось выше. Нельзя выбирать значение переменной, пока она не определена при помощи инструкции ввода, инструкции присваивания или в результате ассоциирования с переменной или элементом массива, которые были определены *\ 4.2. tEKCTOBblE ПОДЦЕПОЧКИ Текстовая подцепочка — это последовательность расположенных подряд литер, входящих в состав некоторого элемента данных текстового типа. Подцепочка не может быть пустой и имеет текстовой тип, так что ее можно использовать в текстовых выражениях. Для того чтобы определить или выбрать значение подцепочки, подцепочку необходимо специфицировать при помощи имени подцепочки. 4.2.1. Имя подцепочки Подцепочка специфицируется при помощи имени подцепочки, которое может быть задано в одной из форм: »([«№.]) a (s[9 s]...)(M:K|) 1} Переменная может быть также определена при помощи оператора DATA. — Прим. перев.
46 4. Структуры данных где V — имя текстовой переменной а —имя текстового массива ei и е* — целые выражения, которые мы будем называть граничными выражениями подцепочки s — индекс Выражение ег определяет крайнюю левую текстовую позицию подцепочки относительно «родительского» текстового элемента данных1}, а е2 — крайнюю правую позицию. Так, запись C(I : J) обозначает подпоследовательность литер текстовой переменной С с 1-й по J-ю; D(3,2) (I : J) обозначает подпоследовательность литер с 1-й по J-ю текстового элемента данных, расположенного во 2-м столбце и 3-й строке текстового массива D. Приведем несколько более конкретных примеров. Пусть CHARACTER ABT * 8,BLDG (10,5) * 12 АВТ-'VARIABLE' BLDG (2,4) ='WINE FOR ONE' Значением текстовой подцепочки с именем АВТ (5 : 8) будет "ABLE", а значением подцепочки BLDG(2,4) (6 : 8) будет "FOR". (В инструкции описания типа CHARACTER декларированы текстовая переменная АВТ длины 8 и текстовый массив BLDG, каждый элемент которого имеет длину 12.) Длина текстовой подцепочки равна е2—ег+\. 4.2.2. Граничные выражения подцепочки Выражения ег и е2 в имени подцепочки называются граничными выражениями подцепочки. Обозначим через ten длину «родительского» текстового элемента данных, тогда в момент обращения к подцепочке значения выражений ех и е2 должны удовлетворять соотношениям Следует отметить, что, согласно данному определению имени подцепочки, нельзя опускать ни скобки, окружающие выражения ег и е2, ни разделяющее их двоеточие. Если опущено выражение еи то по умолчанию процессор использует значение 1. Аналогично если опущено е2, то берется значение len. Запись v(:), в которой опущены оба выражения ег и е2у эквивалентна просто v, а запись a(s[,s]...)(:) эквивалентна a(s[,s]...). В качестве граничного выражения подцепочки допускается любое правильно построенное целое выражение, при условии 1} Напомним, что текстовые позиции в цепочке перенумерованы последовательно слева направо целыми числами, начиная с 1.
4.3. Массивы 47 что оно не содержит обращений к функции, выполнение которой может повлиять на значения другого граничного выражения в том же имени подцепочки. 4.3. МАССИВЫ Массив — это набор элементов данных одного и того же типа, занимающих последовательные единицы памяти в некотором отрезке памяти. Каждый массив обладает следующими атрибутами: 1. Имя массива 2. Тип массива 3. Набор значений, которые мы будем называть элементами массива 4. Число измерений 5. Протяженность массива по каждому измерению 6. Нижняя и верхняя границы массива по каждому измерению Можно ссылаться на массив при помощи одного только имени массива, если имеет место определение или выбор значения всего массива целиком, а можно также ссылаться на отдельный элемент массива, указав имя массива и соответствующий индекс. Каждый элемент массива может быть определен или неопределен. 4.3.1. Имя и тип массива Имя массива должно удовлетворять указанным выше правилам составления имен и фиксируется как имя массива при помощи инструкции описания массивов, инструкции описания общих блоков или инструкции описания типа. Все массивы в Фортране 77 должны быть описаны и могут иметь любой из упоминавшихся ранее типов — целый, вещественный, двойной точности, комплексный, логический или текстовый. Тип массива определяется либо явно в операторе описания типа, либо неявно по первой букве имени массива. Массив может иметь от одного до семи измерений. 4.3.2. Распределение памяти для массивов Память для массива отводится в той программной компоненте, в которой он декларируется, если только он не описан как формальный параметр этой подпрограммы; в последнем случае массив передается подпрограмме извне в качестве аргумента. Декларация массива в программной компоненте, в которой для него фактически будет отведена память, называется декларацией фактического массива. Декларация массива в подпрограмме, в
48 4. Структуры данных которую он будет передан как параметр, называется декларацией формального массива. В декларации фактического массива число его измерений и размер по каждому измерению не могут быть переменными. В декларации формального массива размер массива по каждому измерению может быть как регулируемым, так и постоянным. Вопросы, связанные с декларированием массивов, рассматриваются более подробно в последующих главах. Массивы Фортрана 77 располагаются в памяти, как говорят, «по столбцам». Это означает, что быстрее всего изменяется самый левый индекс. При хранении массива «по строкам» (в лексикографическом порядке), напротив, быстрее всего изменяется самый правый индекс. 4.3.3. Измерения массива Описать массив можно при помощи инструкции DIMENSION, COMMON или инструкции описания типа, например, следующим образом: REAL описатель-массива [, описатель-массива]... где «описатель-массива» имеет вид а(Л,(Я...) где а — им5Г массива, ad — описание измерения массива вида [d1:]d2 здесь dt — нижняя граница, a d2 — верхняя граница индексов для данного измерения. Если dt опущена, то подразумевается значение 1. Так, массивы, описанные инструкцией REAL A (2,0:3), В (—1 : 6) будут состоять из элементов: Массив А А(1,0) А(2,0) |_Л(1,1) А(2,1) АО,2) А(2,2) А(1,3) А(2,3) t Массив В В(-1) 1 В(0) В(1) В(2) В(3) В(4) В(5) В(6)
4.3. Массивы 49 Размер массива по каждому измерению называется его протяженностью. В приведенном выше примере протяженность массива А по строкам равна 2, а по столбцам — 4. Протяженность массива В равна 8. 4.3.4. Индекс массива Для того чтобы присвоить значение отдельному элементу массива или выбрать значение элемента, необходимо указать индекс элемента. Индекс имеет вид (S[,S).:) 9 где s — индексное выражение. Каждое индексное выражение является индексом по соответствующему измерению, и его значение должно лежать в пределах границ массива по этому измерению. Необходимые для выбора элемента массива индексные выражения разделяются запятыми и заключаются в скобки. Термин индекс относится ко всей, совокупности индексных выражений вместе с запятыми и скобками. В качестве индексного выражения допускается любое правильно построенное целое выражение, не содержащее обращений к таким функциям, выполнение которых может повлиять на значения других индексных выражений в том же индексе. 4.3.5. Выбор элемента массива Для того чтобы выбрать элемент массива, необходимо указать имя элемента массива, которое имеет вид a(s[ys\...) где а — имя массива, а буквами s обозначены индексные выражения. Число индексных выражений должно совпадать с числом измерений массива, указанным в его описателе. Так, для массивов, описанных инструкцией REAL А(2,0:3), В(—1 : 6) запись А (2,1) будет обозначать элемент, расположенный во второй строке и в первом столбце массива А. Это четвертый элемент отрезка памяти, занимаемого массивом А. Аналогично запись В(1) относится к элементу массива В, который выбирается при помощи индексного выражения, имеющего значение 1; это третий элемент отрезка памяти, занимаемого массивом В. Доступ к элементу массива осуществляется при помощи значения индекса, вычисляемого с участием значений границ массива и соответствующих индексных выражений в момент ссылки на элемент. Этот вопрос относится к управлению памятью, которое рассматривается в одной из последующих глаз.
ВЫРАЖЕНИЯ 5.1. ОБЩИЙ ОБЗОР Выражение — это последовательность операндов, операций и скобок, задающая некоторые вычисления. Это могут быть вычисления над числовыми, текстовыми, логическими значениями, вычисления отношений. После выполнения этих вычислений получается значение выражения. Оно используется при выполнении инструкции Фортрана 77, в которой это выражение встретилось. В настоящем стандарте правила использования выражений были обобщены — выражения разрешается использовать там, где раньше допускались только простые переменные или элементы массивов. В новом Фортране разрешаются смешение типов в выражениях и более общий вид индексов. Синтаксическая диаграмма для выражений Фортрана 77 вынесена в приложение. 5.2. АРИФМЕТИЧЕСКИЕ ВЫРАЖЕНИЯ Значением арифметического выражения является число. Это значение — или результат действий над числами, или значение арифметической константы, арифметического параметра, арифметической переменной или элемента арифметического массива. Следовательно, простейший вид арифметического выражения — арифметическая константа, арифметический параметр, ссылка на арифметическую переменную, на элемент арифметического массива или обращение к арифметической функции 1}. Используя арифметические операции и скобки, можно определять сложные последовательности вычислений. 5.2.1. Арифметические операции В Фортране 77 определены пять арифметических операций: Знак операции Название * * Возведение в степень / Деление Х) Обращение к арифметической функции может требовать вычисления значений фактических параметров, а также вычислений в теле самой функции.
5,2t Арифметические выражения 51 * Умножение — Вычитание или взятие со знаком «минус» •+• Сложение или тождественная операция (взятие со знаком «плюс») Операции + и — можно использовать как с одним, так и с двумя операндами. Операции *, / и #*— только с двумя. Вид и смысл пяти арифметических операций приведены в табл. 5.1. Старшинство операций при вычислении арифметических выражений следующее: Операция Старшинство #* Высшее * и / } + и — Низшее Правила старшинства означают, что из операций, написанных в выражении последовательно, раньше выполняются те, старшинство которых выше. Так, в выражении А+В *# C#D операции на самом деле выполняются так: 1. В * * С Результат обозначим через X, получим A + X*D 2. X * D Результат обозначим через Y, получим A + Y 3. A-fY Получим окончательный результат Аналогично, при вычислении выражения —R#*2, где R равно 3, получим результат —9, поскольку взятие со знаком «минус» выполняется в последнюю очередь* 5.2.2. Арифметические операнды В качестве арифметических операндов должны задаваться значения типов: целое, вещественное, с двойной точностью или комплексное. Более того, существуют определенные правила, описывающие допустимые комбинации конкретных one-
52 5. Выражения Таблица 5.1 Вид и смысл арифметических операций г) Вид Х\%*Х2 хг/х2 Х±#Х2 Х\ — Х2 *i + *2 —х2 + *2 Смысл Возведение в степень: х\ возводится в степень х2 Деление: хъ деленный на х2 Умножение: х1у умноженный на х2 Вычитание: хг минус х2 Сложение: хг плюс х2 Взятие со знаком «минус»: 0 минус х2 Взятие со знаком «плюс»: 0 плюс х2 1) хх и х2 обозначают арифметические операнды. рандов в арифметическом выражении. Об этом будет рассказано ниже. Значение, используемое в качестве операнда, может быть значением арифметической константы, арифметического параметра, арифметической переменной; может быть получено ссылкой на элемент арифметического массива, обращением к арифметической функции или как промежуточный результат при вычислении арифметического выражения. Поскольку любой способ получения арифметического значения подразумевает некоторое арифметическое выражение, можно сказать, что операндами арифметических операций должны быть арифметические выражения. 5.2.3. Структура арифметических выражений Один из способов точного задания структуры арифметического выражения — иерархическая система определений, начиная с определения арифметического выражения. Операнды, обсуждавшиеся в предыдущем разделе, находятся на низшем уровне этой иерархии. Такой иерархический метод представления изображен на рис. 5.1. Форма арифметического выражения представлена на нем в виде диаграммы. Арифметическое выражение находится на высшем уровне иерархии и имеет вид: Терм + терм — терм Арифметическое выражение + терм Арифметическое выражение — терм
Обозначения: О ©означает- объединение составных частей означает выбор одной из альтернатив Простое выражение Арисрме- Арифметический тическая параметр константа без знака Ссылка на арисрме - тическую переменную Рис. 5.1. Графическое представление формы арифметического выражения.
54 5t Выражения где понятие «терм» определяется ниже. В этом определении по существу утверждается, что арифметическое выражение может начинаться со знака «плюс» или «минус», что последовательные аддитивные операции выполняются слева направо, что две арифметические операции не могут следовать друг за другом. Так, например, в выражении А*В — С подвыражение А*В выполняется в первую очередь, поскольку это «арифметическое выражение» в смысле определения, данного выше. Аналогично, в выражении А+В*С подвыражение В*С выполняется первым, так как в смысле данного выше определения это «терм». Таким образом, мы видим, что отношение приоритета между операциями — удобный, хотя и не обязательный метод определения; ту же информацию можно извлечь из иерархического представления. Понятие терма дает возможность ввести в арифметическое выражение мультипликативные операции. Терм имеет вид: Множитель Терм/множитель Терм * множитель где понятие «множитель» определяется ниже. В этом определении по существу утверждается, что последовательные мультипликативные операции выполняются слева направо. Так, например, в выражении А#В/С подвыражение А*В выполняется первым. Понятие множителя вводит операцию возведения в степень. Множитель имеет вид: простое выражение простое выражение ** множитель где понятие «простое выражение» определяется ниже. В этом определении утверждается, что множитель состоит из последовательности простых выражений, разделенных операциями возведения в степень. Таким образом, операция возведения в степень имеет наивысший приоритет и выполняется раньше операций с более низким приоритетом, таких, как умножение или сложение. В этом определении также утверждается, что последовательные операции возведения в степень выполняются справа налево, поскольку «множитель» в нем — правый операнд. Так, в выражении А*#В##С подвыражение В**С выполняется в первую очередь, как если бы выражение было записано в виде А##(В##С). Простое выражение является базовой составной частью арифметического выражения и задает правила группировки частей выражения при помощи скобок. Виды простого арифметического выражения:
5.2. Арифметические выражения 55 Арифметическая константа без знака Арифметический параметр Ссылка на арифметическую переменную Ссылка на элемент арифметического массива Обращение к арифметической функции Арифметическое выражение, заключенное в скобки Приведенные выше правила также означают, что нет подразумеваемых операций, таких, как «подразумеваемое умножение», и что две операции не могут следовать друг за другом. Так, неправильное выражение А+ —В должно было быть записано в виде А+ (—В). 5.2.4. Арифметические выражения специального вида В Фортране 77 используются два специальных вида арифметических выражений: арифметическое константное выражение и целое константное выражение. Арифметическое константное выражение — это правильное арифметическое выражение, в котором каждое простое выражение в смысле определения, данного выше,— либо арифметическая константа, либо арифметический параметр, либо арифметическое константное выражение в скобках. В выражениях этого вида запрещено возведение в степень, кроме случаев, когда показатель степени имеет целый тип. Целое константное выражение — это арифметическое константное выражение, в котором каждая арифметическая константа или арифметический параметр имеет целый тип. 5.2.5. Правила вычисления арифметических выражений Арифметическое выражение, каким бы простым или сложным оно ни было, имеет тип. Арифметическая константа, например, имеет тип, определяемый по форме ее записи. Аналогично, тип переменной, элемента массива, обращения к функции определяется по имени этого объекта. Отсюда следует, что тип выражения определяется типами операндов и функций, обращения к которым встречаются в выражении. 5.2.5.1. Однотипные выражения Однотипным называется выражение, все операнды которого имеют один и тот же тип. Тип значения однотипного выражения совпадает с типом его операндов.
56 5. Выражения 5.2.5.2. Выражения со смешением типов Выражение со смешением типов — это выражение, содержащее операнды двух или более типов. В этом случае для определения типа значения выражения надо к промежуточным результатам, которые получаются в процессе вычисления выражения, последовательно применять правила преобразования типов. Например, сложение вещественного и целого операндов дает результат вещественного типа. Правила преобразования типов для сложения, вычитания, умножения и деления в Фортране 77 приведены в табл. 5.2. Упомянутые там операции преобразования типов процессор выполняет автоматически, явно указывать их в программе не нужно. Например, инструкции INTEGER I REAL A,C,D DOUBLE PRECISION В D-I/(A + B)*(C+1.5) вызовут следующую последовательность действий: 1. Вещественная переменная А преобразуется к двойной точности и складывается с В; результат получится двойной точности. Назовем его Е. Получим D=I/E»(C+1.5) 2. Целая переменная I преобразуется к двойной точности и делится на Е; результат получится двойной точности. Назовем его F. Получим D=F»(C+1.5) 3. Вещественная переменная С складывается с вещественной константой 1.5; результат получится вещественный. Назовем его G. Получим D=F*G 4. Вещественный промежуточный результат G преобразуется к двойной точности и умножается на F; результат получится двойной точности. Назовем его Н. Получим D=H 5. При выполнении инструкции присваивания, речь о которой пойдет позже, значение Н двойной точности преобразуется к вещественному и запоминается в D, чем и заканчивается выполнение инструкции.
Таблица 5.2 Правила вычисления выражения вида хг 0 х2 для различных типов операндов, где ® — это +» —, * или* / х> 1 Хг 1*1 Ri Ь Mi ® 12 R=Rj ® REAL(I2) D=Di®DBLE(l2) OCi ® CMPLX(REAL (Ь)эО.) R2 R=REAL(l!)®R2 R=R, © R2 D=DX ® DBLE(R2) C=d®CMPLX(R2A) D2 D=DBLE(I1)©D2 D^DBLECRj^Dj D=DX ® D2 Запрещено c2 C=CMPLX(REALUi),0.)® C2 C=CMPLX(RbO.)©C2 Запрещено j C=Ci ® C2 » 1 обозначает операнд целого типа, R*~вещественного типа, D — двойной точности, С—комплексный. Таблица 5.3 Правила вычисления выражения вида хг * * х2 для различных типов операндов *> хг Г1 Ri la I=l!»*l2 R=Ri**I2 P=Di»*I2 C=Ci**l2 R* R=REAL(l!)**R2 R=Rt**R2 D=Di**DBLE(R2) OC1**CMPLX(R2,0.) r>2 D=DBLE(l!)**D2 D=DBLE(Ri)**D2 P-D!**D2 Запрещено c2 OCMPLX(REAL(l! ),0.)**C2 C=CMPLX(RJ,0.)**C2 Запрещено C=Ci**C2 О 1 обозначает операнд целого типа, R «вещественного типа, D-* двойной точвости, С •=-комплексный.
58 5e Выражения 5.2.5.3. Унарные операции Операция с одним операндом называется унарной операцией. Как уже было сказано выше, в Фортране 77 две унарные операции: взятие со знаком «минус» и взятие со знаком «плюс», которые пишутся соответственно как —А и +А. Тип результата унарной операции совпадает с типом ее операнда. 5.2.5.4. Целочисленное деление Как указано в табл. 5.2, результатом деления целых чисел является значение целого типа. Например, выражение —5/2 дает результат —2. Целое частное вычисляется по следующим правилам: 1. Если абсолютная величина математического частного меньше единицы, то результат равен нулю. (Например, как —1/3, так и 1/2 дают в результате 0.) 2. Если абсолютная величина математического частного больше или равна единице, то результат — наибольшее целое со значением, не превосходящим абсолютной величины математического частного, взятое с тем же знаком, какой имеет математическое частное. (Например, (—10)/3 дает в результате (—3), а (—17)/(—5) дает в результате 3.) 5.2.5.5. Возведение в степень Вообще говоря, правило преобразования типов утверждает, что в случае применения арифметической операции к операндам разных типов тот операнд, тип которого отличается от типа результата, преобразуется к типу результата, так что арифметическая операция выполняется над операндами одного типа. Исключением из этого правила является операция возведения в степень. Как показано в табл. 5.3, при возведении в целую степень операнда вещественного, с двойной точностью или комплексного целый показатель степени не преобразуется. В случае возведения целого значения в целую степень, т. е. Ii**I2,результат при отрицательном 12 будет равен l/(l!**ABS(I2)), где целое частное вычисляется по правилам целочисленного деления. 5.3. ТЕКСТОВЫЕ ВЫРАЖЕНИЯ Значением текстового выражения является цепочка литер. Это значение — либо результат одной или более операций конкатенации над текстовыми значениями, либо значение текстовой функции, текстовой константы, текстового параметра, текстовой переменной или элемента текстового массива. Так
5.3. Текстовые выражения 59 что простейший вид текстового выражения — текстовая константа, текстовый параметр, ссылка на текстовую переменную, текстовый массив или подцепочку, либо обращение к текстовой функции. Используя операцию конкатенации и скобки, можно определять сложные последовательности операций над цепочками литер. 5.3.1. Текстовые операции В Фортране 77 определена одна текстовая операция — конкатенация. Конкатенация двух текстовых операндов сг и с2 записывается в виде cjlc2 и обозначает текстовое значение си дополненное справа текстовым значением с2. Таким образом, значение текстового выражения 'АВС7/' 123+' —цепочка литер 'АВС123+\ 5.3.2. Текстовые операнды Текстовый операнд должен задавать значение текстового типа. Значение, используемое в качестве такого операнда, может быть значением текстовой константы, текстового параметра, текстовой переменной или подцепочки; может быть получено по ссылке на текстовый массив или при обращении к текстовой, функции либо как промежуточный результат при вычислении текстового выражения. Поскольку любой способ получения текстового значения подразумевает некоторое текстовое выражение, можно сказать, что операндами операции конкатенации должны быть текстовые выражения. 5.3.3. Структура текстовых выражений Для задания точного вида текстового выражения используется иерархическая система определений. Текстовое выражение находится на высшем уровне этой иерархии и имеет вид простое текстовое выражение текстовое выражение//простое текстовое выражение где «простое текстовое выражение», упомянутое выше в качестве возможного вида операнда, более подробно определяется далее. Данное определение утверждает, что текстовое выражение — это либо простое текстовое выражение, либо два или более простых текстовых выражения, разделенных знаками конкатенации. Вторая строка в определении также означает, что последовательные операции конкатенации выполняются слева направо, так что C//D//E эквивалентно (C//D)//E.
60 5. Выражения Простое текстовое выражение является базовой составной частью текстового выражения и определяет способ группировки частей выражения с использованием скобок. Виды простого текстового выражения: текстовая константа текстовый параметр ссылка на текстовую переменную ссылка на элемент текстового массива ссылка на подцепочку обращение к текстовой функции текстовое выражение в скобках Эти правила также означают, что нет подразумеваемых операций конкатенации, так что А В воспринимается просто как переменная АВ. 5.3.4. Текстовые выражения специального вида В Фортране 77 имеется один специальный вид текстовых выражений: константное текстовое выражение. Константное текстовое выражение — это правильное текстовое выражение, в котором все простые текстовые выражения не что иное, как текстовые константы или текстовые параметры. 5.4. ВЫРАЖЕНИЯ ОТНОШЕНИЯ Выражение отношения представляет логическое значение х), полученное сравнением двух арифметических выражений или двух текстовых выражений. Текстовое выражение нельзя сравнивать с арифметическим. Выражение отношения может появляться только в логическом выражении. При этом выражение отношения по определению само является логическим выражением, так как оно всегда принимает логические значения. Этот вопрос будет рассмотрен позднее. 5.4.1. Операции отношения В Фортране 77 имеется шесть операций отношения: Операция .LT. .LE. .EQ. .NE. .GE. .GT. Название Меньше Меньше или равно Равно Не равно Больше или равно Больше *> Логическое значение — это «истина» или «ложь».
5 А. Выражения отношения 61 Таблица 5.4 Вид и смысл операций отношения1* Вид X!.LE.*2 *!.EQ.*2 *l.NE.*2 Xi. GE. x2 ^i.GT.^2 Смысл Меньше: выражение принимает значение «истина», если значение хг меньше значения хъ и «ложь» в противном случае Меньше или равно: выражение принимает значение «истина», если значение хх меньше или равно значению х2ь и «ложь» в противном случае Равно: выражение принимает значение «истина», если значение хг равно значению х2, и «ложь» в противном случае Не равно: выражение принимает значение «истина», если значение хг не равно значению лг2, и «ложь» в противном случае Больше или равно: выражение принимает значение «истина», если значение хг больше или равно значению х2, и «ложь» в противном случае Больше: выражение принимает значение «истина», если значение х1 больше значения x2i и «ложь» в противном случае *) xt и х2~-выражения (оба арифметические или оба текстовые выражения). Каждая операция подразумевает наличие двух операндов, записанных в виде xt опер, отношения х2 где *i и х2 — операнды (оба арифметические или оба текстовые). Смысл шести операций отношения описан в табл. 5.4. 5.4.2. Операнды операций отношения Операнды операций отношения могут быть правильными арифметическими или правильными текстовыми выражениями. Приоритет операций в Фортране 77 таков, что арифметические и текстовые операции выполняются до операций отношения. 5.4.3. Вычисление выражений отношения Значение выражения отношения — это «истина» или «ложь». Способ вычисления выражения зависит от типов операндов.
62 5. Выражения 5А.3.1. Арифметические выражения отношения Арифметическое выражение отношения имеет вид ег опер, отношения е2 где et и е2 — арифметические выражения, целые, вещественные, двойной точности или комплексные, а опер, отношения — операция отношения. Операнды ег и е2 могут быть комплексными только в случае операций .EQ. или .NE.. Результат арифметического выражения отношения является истинным, если упомянутое в нем отношение справедливо. Если ег и е2 имеют разные типы, выражение вычисляется по правилу ((^i) — (^2)) опер, отношения О где выражение ((вх)—(е2)) вычисляется с учетом правил преобразования типов, а значение 0 имеет тот же тип, что и значение этого выражения. Если ((d)—(е2)) представляет собой неправильное выражение, такая форма сравнения недопустима. Так, нельзя сравнивать комплексное выражение с выражением двойной точности. 5.4.3.2. Текстовые выражения отношения В случае текстовых операндов сравниваются двоичные коды текстовых операндов и значение выражения — «истина», если заданное отношение между нЖш выполнено. Текстовое выражение отношения имеет вид Ci опер, отношения с$ где Ci и с2 — текстовые выражения, а опер, отношения — операция отношения. Результат текстового выражения отношения зависит от упорядоченности кодов литер по возрастанию. Так, с1 меньше с2у если сг предшествует с2 в упорядоченной по возрастанию последовательности кодов. Проверки на равенство, однако, не зависят от упорядочения литер, так что операции .EQ. и .NE. можно использовать на любом процессоре. Результат остальных операций сравнения зависит от конкретного процессора. Если текстовые операнды имеют разную длину, более короткий операнд при сравнении дополняется справа пробелами до длины более длинного.
5.5. Логические выражения 63 5.5. ЛОГИЧЕСКИЕ ВЫРАЖЕНИЯ Логическое выражение принимает логическое значение. Это значение — или результат логических вычислений, или значение логической константы, логического параметра, логической переменной или элемента логического массива. Так что простейшая форма логического выражения — логическая константа, логический параметр, ссылка на логическую переменную, логический массив или обращение к логической функции х>. Используя логические операции и скобки, можно определять сложные последовательности вычислений. 5.5.1. Логические операции В Фортране 77 определены пять логических операций: Операция ' Название .NOT. Логическое отрицание ' .AND. Конъюнкция .OR. Дизъюнкция .EQV. Логическая эквивалентность .NEQV. Логическая неэквивалентность Логическая операция .NOT. используется с одним операндом; операции .AND., .OR., .EQV., .NEQV. требуют двух операндов. Вид и смысл пяти логических операций приведены в табл. 5.5. Старшинство операций при вычислении логических выражений следующее: Операция Старшинство .NOT. Высшее .AND, .OR. .EQV. и .NEQV, Низшее Правила старшинства означают, что из операций, написанных последовательно, раньше выполняются те, старшинство которых выше. Так, в выражении Q.EQV.R.AND.S.OR.T операции на самом деле выполняются в таком порядке: 1. R.AND.S Результат обозначим через А. Получим Q .EQV. A .OR. T х> Обращение к логической функции может само по себе требовать логических вычислений значений параметров, а также содержать логические вычисления в теле самой функции.
64 5. Выражения Таблица 5.5 Вид и смысл логических операций 1} *1 истина истина ложь ложь х2 истина ложь истина ложь .NOT.A-2 ложь истина ложь истина ^.AND.^jj истина ложь ложь ложь xl.OR.x2 истина истина истина ложь *!.EQV.a:2 истина ложь ложь истина Xt.NEQV.Xt ЛОЖЬ истина истина ЛОЖЬ ') ^ и х2 обозначают логические операнды. 2. A.OR.T Результат обозначим через В. Получим Q .EQV. В 3. Q .EQV. В Получим окончательный результат Аналогично, вычисление выражения .NOT. U .AND. V, где U ложно, а V истинно, дает истинный результат, поскольку операция отрицания выполняется в первую очередь. 5.5.2. Логические операнды Логические операнды должны задавать значения логического типа. Значение, используемое в качестве операнда, может быть значением логической константы, логического параметра, логической переменной, элемента логического массива, результатом обращения к логической функции, результатом выражения отношения, либо промежуточным результатом при вычислении логического выражения. Поскольку любой способ получения логического значения подразумевает некоторое логическое выражение, можно сказать, что операндами логических операций должны быть логические выражения. 5.5.3. Структура логических выражений Для задания точного вида логического выражения используется иерархическая система определений. На рис. 5.2 структура логического выражения представлена в виде диаграммы в соответствии с этой системой.
Логическая Логический Ссылка на Ссылка на Обращение Выражение константа параметр логическую элемент к логической отношения переменную логического функции с массива Рис. 5.2. Графическое представление формы логического выражения. 3 Г. Катцан
66 5. Выражения Логическое выражение находится на высшем уровне этой иерархии и имеет вид логическая сумма логическое выражение .EQV. логическая сумма логическое выражение .NEQV. логическая сумма где понятие «логическая сумма» определяется ниже. В этом определении по существу утверждается, что в логическом .выражении, содержащем две или более операции .EQV. и .NEQV., логические суммы связываются слева направо (или, что то же самое, последовательные операции .EQV. и .NEQV. выполняются слева направо). Так, в выражении U .EQV. V .NEQV. W операции выполняются, как если бы было написано (U .EQV. V) .NEQV. W. Понятие логической суммы вводит операцию дизъюнкции, которая записывается как .OR.; логическая сумма имеет вид логический терм логическая сумма .OR. логический терм где понятие «логический терм» определяется ниже. В этом определении утверждается, что в логическом" выражении, содержащем две или более операции .OR., логические термы связываются слева направо (или, что то же самое, последовательные операции .OR. выполняются слева направо). Так, в выражении A .OR. В .OR. С операции выполняются так, как если бы было написано (A .OR. В) .OR. С. Понятие логического терма вводит операцию конъюнкции .AND.; логический терм имеет вид логический множитель логический терм .AND. логический множитель где понятие «логический множитель» определяется ниже. В этом определении утверждается, что в логическом выражении с двумя или более операциями .AND. логические множители связываются слева направо (или, другими словами, последовательные операции .AND. выполняются слева направо). Так, в выражении 1 .AND. J .AND. К операции выполняются так, как если бы было написано (I .AND. J) .AND. К. Логический множитель определяется для введения операции логического отрицания .NOT. и имеет вид простое логическое выражение .NOT. простое логическое выражение где понятие «простое логическое выражение» определяется ниже. Поскольку .NOT. в иерархии определений находится ниже остальных операций, операция .NOT. выполняется перед
5.5, Логические выражения 67 .AND., .OR., .EQV. или .NEQV.. Так, в выражении .NOT. Q .OR.S.AND.T операции выполняются так, как если бы было написано (.NOT. Q) .OR. (S .AND. T). Простое логическое выражение является базовой составной частью логического выражения и задает правила группировки частей логического выражения при помощи скобок. Виды простого логического выражения: логическая константа логический параметр ссылка на логическую переменную ссылка на элемент логического массива обращение к логической функции выражение отношения логическое выражение в скобках Если говорить о правилах формирования логических выражений, то можно отметить, что, как и в случаях с другими типами выражений, отсутствуют подразумеваемые логические операции; две логические операции, каждая из которых требует двух операндов, не могут стоять рядом. 5.5.4, Логические выражения специального вида В Фортране 77 есть один специальный вид логического выражения: логическое константное выражение. Логическое константное выражение — это правильное логическое выражение, в котором каждое простое логическое выражение — это логическая константа логический параметр выражение отношения, в котором каждое простое выражение — константное выражение логическое константное выражение в скобках Таким образом, логическое константное выражение может содержать арифметические и текстовые константные выражения. 5.5.5. Замечание о выполнении логических выражений Одно из правил Фортрана 77 заключается в том, что процессору не нужно вычислять все операнды операции и даже выполнять все операции в выражении, если значение выражения можно определить, не делая этого. Это правило применяется к вычислению любых выражений, но особенно часто оно бывает применимо к логическим выражениям, так как их значение истинности часто зависит от значения одного операнда. з*
68 5. Выражения Например, в выражении A. LT. В. OR. C.GT.D для истинности выражения достаточно истинности только одного из операндов операции .OR. . Так что, если А меньше В, нет необходимости вычислять подвыражение C.GT.D, а выражение в целом истинно. Аналогично, в выражении A.GT.B.AND.C.LT. D для ложности выражения достаточно ложности только одного операнда операции .AND. . Так что, если А не больше В, нет необходимости вычислять подвыражение C.LT.D, а выражение в целом ложно. 5.6. ИНТЕРПРЕТАЦИЯ И ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЙ Имеется ряд правил и соглашений, касающихся вычисления выражений в целом. Речь идет о старшинстве операций различных типов, неприкосновенности скобок, правилах интерпретации, вычислении функций, а также о правилах, применимых к особым типам выражений. 5.6.1. Старшинство операций различных типов Когда в одном выражении встречаются операции различных типов, такие, как арифметические, отношения и логические, между ними соблюдается следующая иерархия: Тип операции Старшинство Арифметический Высшее Текстовый Отношения Логический Низшее ) Так, в выражении А+В*С .LT. D .AND. Q операции выполняются так, как если бы было написано выражение ((А+(В*С)) .LT.D).AND.Q. (Здесь предполагается, что А, В, С и D — арифметические переменные, a Q — логическая переменная.) 5.6.2. Неприкосновенность скобок и правила интерпретации Использование скобок играет в Фортране 77 особую роль и вот почему: в некоторых случаях процессор может изменить порядок выполнения операций в выражении согласно правилам ассоциативности и дистрибутивности, чтобы минимизировать время вычисления. Выражения в скобках, однако, всегда восприни-
5.6. Интерпретация и вычисление выражений 69 маются как единый объект. Использование скобок, таким образом, служит отправной точкой для сведения воедино правил сочетания операций и операндов: 1. Использование скобок 2. Старшинство операций 3. Выполнение операций возведения в степень внутри множителя справа налево 4. Выполнение мультипликативных операций (умножение и деление) внутри терма слева направо 5. Выполнение аддитивных операций (сложение и вычитание) в арифметическом выражении слева направо 6. Выполнение операций конкатенации в текстовом выражении слева направо 7. Выполнение операций конъюнкции (т. е. .AND.) внутри логического терма слева направо 8. Выполнение операций дизъюнкции (т. е. .OR.) в логической сумме слева направо 9. Выполнение операций логической эквивалентности (т. е. .EQV. и .NEQV.) в логическом выражении слева направо Операции отношения и операция логического отрицания (.NOT.) учтены в приведенном здесь списке в п. 2— старшинство операций. 5.6.3. Математические соображения По поводу вычисления выражений в Фортране 77 можно высказать несколько очевидных и не столь очевидных соображений. Очевидные соображения таковы: 1. В момент ссылки на объект он должен быть определен, причем определен значением правильного типа. 2. Нельзя выполнять операции, не определенные в математике (такие, как возведение нуля в нулевую степень). «Не столь очевидные» соображения касаются математической эквивалентности. Два выражения эквивалентны математически, если при любых значениях входящих в них простых выражений значения двух выражений равны. Более того, разница между, например, целочисленным делением и делением вещественных чисел является математическим различием. При интерпретации выражений процессор может, как об этом сказано ниже, производить математически эквивалентные преобразования. I
70 5 * Выражения 5.6.4. Обращения к функциям Чтобы обеспечить однозначность результатов вычислений, на использование определенных внешних функций надо наложить некоторые ограничения. Ограничения касаются не определенных внешних функций как таковых, а только способа их использования в конкретных выражениях. Вот эти ограничения: 1. Выполнение функции в выражении не может определять никаких других объектов, входящих в это выражение, ни явным присваиванием значения фактическому параметру, ни неявно через общую память. Так, например, в выражении A=B+FCN(B)+C(I) функция FCN не должна влиять на значения переменных В, I и массива С. 2. В инструкциях, содержащих более одного обращения к функциям, функции могут выполняться в любом порядке, за исключением следующих случаев: а) Когда одно обращение к функции встречается в списке фактических параметров другого обращения к функции, как в такой инструкции: A=FCNA(B+FCNB(Q) где FCNA и FCNB — функции (здесь FCNB выполняется раньше FCNA). б) Когда одно обращение к функции встречается в логическом выражении логической инструкции IF, а другое — в инструкции, которая является частью той же логической инструкции IF, например: IF(A .AND. FCNR(T))A=B+FCNB(C) где FCNR и FCNB — функции. (Здесь FCNR выполняется раньше FCNB.) Основной результат наложения таких ограничений на обращения к функциям заключается в том, что никакое обращение к функции не может определить переменную, от которой зависит значение какой-либо другой функции в том же выражении, кроме вышеупомянутого случая с логической инструкцией IF. 5.6.5. Вычисление выражений Приведенное выше правило о том, что «не нужно вычислять все операнды в выражении, если значение выражения можно определить, не делая этого», разбирается здесь более подробно;
5.6 Интерпретация и вычисление выражений 71 отдельно рассматриваются фактические параметры, индексы, ссылки на подцепочки, арифметические выражения, выражения отношения, логические выражения и текстовые выражения.* 5.6.5.1. Фактические параметры Тип выражения, содержащего обращение к функции, никак не связан с типом выражения — фактического параметра из списка параметров этой функции. Так, тип выражения не влияет на тип фактического параметра, и, аналогично, тип фактического параметра не влияет на тип выражения, содержащего обращение к функции. 5.6.5.2. Индексы Тип индексного выражения в выражении, содержащем ссылку на массив, никак не связан с типом выражения. Так, тип индексного выражения не влияет на тип выражения, содержащего соответствующую ссылку на массив, а тип всего выражения не влияет на вычисление индекса, если в этом выражении имеется ссылка на массив. 5.6.5.3. Ссылка на подцепочку Вычисление целых выражений, входящих в ссылку на текстовую подцепочку, не зависит от того текстового выражения, в котором они используются. 5.6.5.4. Математическая эквивалентность При вычислении выражений процессору разрешаются их эквивалентные преобразования при условии, что соблюдается неприкосновенность скобок и что целые операнды не смешиваются с операндами других типов так, чтобы мог получиться неэквивалентный результат. В табл. 5.6 и 5.7 приведены примеры соответственно допустимых и недопустимых преобразований. 5.6.5.5. Эквивалентность отношений Два выражения эквивалентны, если их логические значения равны для всех возможных значений входящих в них простых выражений. Так, например, выражение отношения A.GT. В процессор может вычислить в виде В — A .LT. 0.0, если выполнены приведенные выше правила вычисления выражений отношения.
72 5. Выражения Таблица 5.6 Допустимые преобразования арифметических выражений 1) Выражение А + В А*В — А + В А + В + С А —В + С Допусти мое преобразование В + А В* А В-А i А + (В + С) А —(В —С) Выражение А* В/С А* В —А*С А/ В/С А/5.0 Допустимое преобразование А * (В/С) А*(В—С) А/(В * С) 0.2*А 1) Замечание. А, В и С —вещественные, с двойной точностью или комплексные операнды. Таблица 5.7 Недопустимые преобразования арифметических выражений *> Выражение 1/2 A* I/J I/J/A (А* В) — (А* С) А* (В —С) Недопустимое преобразование 0.5*1 А *(I/J) I/(J * A) А*(В—С) А*В —А*С Причина Математически разная форма Математически разная форма Математически разная форма Неприкосновенность скобок Неприкосновенность скобок О Замечание. А, В и С —вещественные, с двойной точностью или комплексные операнды, I и J —целые операнды. 5.6.5.6. Логическая эквивалентность Два логических выражения эквивалентны, если их логические значения равны при всех возможных значениях входящих в них простых выражений. Таким образом, процессор может вычислить выражение в другой форме, если только эта форма логически эквивалентна исходной. Следующие примеры демонстрируют эти правила для логических переменных Р, Q и R: Выражение Преобразование Пояснение Р .AND. Q .AND. R P .AND. (Q .AND. R) Все нормально — преобразование логически эквивалентно (Р .AND. Q) .AND. R P .AND. (Q .AND. R) Так нельзя: нарушена неприкосновенность скобок J
5,6, Интерпретация и вычисление выражений 73 Во всех случаях остаются в силе приведенные выше правила вычисления логических выражений и операндов. 5.6,5.7, Текстовые выражения Приведенное выше правило вычисления операндов также применимо к текстовым выражениям. Рассмотрим следующий пример, в котором длина текстовых переменных С, D и Е — две литеры, a CFCN — функция, принимающая текстовое значение: CHARACTERS C,D,E,CFCN C = D//CFCN(E) В этом случае нет необходимости вычислять функцию CFCN, поскольку результат присваивания переменной С определяется только переменной D — ведь и С, и D имеют длину две литеры.
6 ВЫПОЛНЕНИЕ И КЛАССИФИКАЦИЯ ИНСТРУКЦИЙ ФОРТРАНА 6.1. ЦЕЛЬ КЛАССИФИКАЦИИ Цель данной главы — описать последовательность выполнения инструкций в программе на Фортране 77, установить различие между исполняемыми и неисполняемыми инструкциями, описать различные типы инструкций. Эта глава служит введением к последующему ряду глав, в которых рассматриваются отдельные инструкции Фортрана 77. 6.2. ПОСЛЕДОВАТЕЛЬНОСТЬ ВЫПОЛНЕНИЯ Последовательность выполнения в программе на Фортране 77— это порядок, в котором инструкции выполняются процессором. Мы рассмотрим три аспекта: нормальная последовательность выполнения, передача управления и разные вопросы. 6.2.1. Нормальная последовательность выполнения Нормальная последовательность, в которой выполняются инструкции программы на Фортране 77,—это тот порядок, в котором они встречаются в главной программе или внешней процедуре. Выполнение программы начинается с первой исполняемой инструкции главной программы и нормальная последовательность выполнения продолжается с этого места. Когда в главной программе или внешней процедуре встречается обращение к внешней процедуре, выполнение вызывающей инструкции приостанавливается и выполнение программы продолжается с первой исполняемой инструкции в вызванной процедуре, следующей сразу же за соответствующей инструкцией FUNCTION, SUBROUTINE или ENTRY. Выполнение возвращается из вызванной процедуры к вызывающей инструкции, если встретилась явная или неявная инструкция возврата, и нормальное выполнение продолжается с того места, где оно было приостановлено, или с точки альтернативного возврата в вызывающей программе. Процессор осуществляет нормальное завершение исполняемой программы, когда выполняется инструкция STOP в главной программе или во внешней процедуре или когда выполняется инструкция END в главной программе. Процессор осуществляет
6.3. Исполняемые и неисполняемые инструкции 75 ненормальное завершение исполняемой программы, если при его действиях возникает ситуация, препятствующая дальнейшему выполнению программы. 6.2.2. Передача управления Нормальная последовательность выполнения может быть нарушена выполнением одной из нескольких инструкций Фортрана 77; при этом нормальная последовательность выполнения прекращается и выполнение программы возобновляется, начиная с указанной инструкции в главной программе или внешней процедуре. Передача управления осуществляется следующими инструкциями: 1. Инструкция GOTO 2. Инструкция IF арифметическая 3. Инструкции RETURN и STOP 4. Инструкции ввода-вывода со спецификациями возврата по ошибке и по концу файла 5. Инструкция CALL 6. Логическая инструкция IF, которая включает одну из инструкций, упомянутых выше 7. Инструкции IF структурная и ELSE IF 8. Инструкция DO 9. Инструкция END Последняя инструкция блока «если-то» или «иначе-если» или заключительная инструкция DO-цикла тоже неявно вызывают передачу управления через свойственный этим структурам механизм управления. Каждая из приведенных выше инструкций рассмотрена в последующих главах. 6.2.3. Разные вопросы На последовательность выполнения в программах на Фортране 77 не влияют неисполняемые инструкции и строки комментариев. Недопустимы рекурсивные процедуры. Обратившись к внешней процедуре, к ней можно обратиться снова только после того, как в результате предыдущего обращения выполнится инструкция RETURN или END. 6.3. ИСПОЛНЯЕМЫЕ И НЕИСПОЛНЯЕМЫЕ ИНСТРУКЦИИ Инструкции Фортрана 77 делятся на исполняемые и неисполняемые. Исполняемая инструкция совершает определенное действие в выполняемой программе и является потенциальной частью
76 6, Выполнение и классификация инструкций Фортрана последовательности выполнения. Неисполняемая инструкция задает процессору некоторую информацию, управляющую выполнением программы. Как исполняемая, так и неисполняемая инструкция может иметь метку. Передавать управление по метке на неисполняемую инструкцию нельзя. 6.3.1. Список исполняемых инструкций Исполняемые инструкции совершают действия по вычислению, управлению или действия, связанные с вводом-выводом. К этим инструкциям относятся: Инструкция Присваивание GO TO IF IF структурная STOP и PAUSE DO CONTINUE READ, WRITE и PRINT REWIND, BACKSPACE, ENDFILE, OPEN, CLOSE и INQUIRE CALL и RETURN END Основное назначение или характеристика Позволяет выполнять вычисления и определять значения переменных или массивов. Целым переменным может быть присвоено значение метки (при помощи инструкции ASSIGN) Передает управления в безусловно заданную, предписанную или вычисляемую точку Обеспечивает условное ветвление или выполнение инструкций по значению арифметического или логического выражения Конструкция IF-T HEN-ELSE обеспечивает условное выполнение инструкций Завершает или временно приостанавливает выполнение программы Управляет циклами, обеспечивая итеративное выполнение части программы Не выполняет никаких действий, но может использоваться с меткой и, таким образом, указать точку в программе, на которую можно сослаться Обеспечивают функции ввода-вывода Обеспечивают функции управления вводом- выводом Позволяют вызывать внешнюю процедуру и возвратиться из нее Используется в качестве физического конца программной компоненты и вызывает завершение программы или возврат в вызывающую программу при выполнении ее процессором соответственно в главной программе и во внешней процедуре Исполняемые инструкции распадаются на три класса: присваивания, управления и ввода-вывода.
6.3. Исполняемые и неисполняемые инструкции 77 6.3.2. Список неисполняемых инструкций Неисполняемые инструкции не участвуют в формировании последовательности выполнения. К неисполняемым инструкциям относятся: Инструкция PROGRAM, FUNCTION SUBROUTINE, ENTRY и BLOCK DATA DIMENSION, COMMON, EQUIVALENCE, IMPLICIT, PARAMETER, EXTERNAL, INTRINSIC и SAVE INTEGER, REAL DOUBLE PRECISION, COMPLEX, LOGICAL и CHARACTER DATA FORMAT Функция-формула Основное назначение или характеристика Определяет начало программной компоненты, позволяет дать ей имя и задать управляющую информацию Позволяет определять требования к распределению памяти и вводить в употребление имена Позволяет задавать типы данных и требования к распределению памяти Позволяет задать значения переменных до выполнения программы Позволяет задать информацию, управляющую редактированием при вводе-выводе Позволяет определить внутреннюю функцию, состоящую из одной инструкции Неисполняемые инструкции относятся к одному из трех классов: описания, описания формата и подпрограммы.
ИНСТРУКЦИИ ОПИСАНИЯ 7.1. ОБЩИЙ ОБЗОР В совокупности инструкции описания содержат информацию для процессора о том, как работать с памятью, как понимать и использовать идентификаторы, как выполнять инструкции. Чаще всего инструкции описания используются для задания типов данных и требований к распределению памяти, и эти вопросы будут рассмотрены в первую очередь. Наконец, инструкции описания в целом подразделяются на группы по виду информации, которую они могут предоставлять процессору. 7.2. ИНСТРУКЦИИ ОПИСАНИЯ ТИПА Инструкции описания типа используются для задания типов объектов путем отмены неявных спецификаций типа и для задания размерностей массивов. Если имя упомянуто в инструкции описания типа, то тем самым тип соответствующего объекта задан для всех вхождений этого имени в той программной компоненте, где это имя описано. Каждое имя может входить только в одну инструкцию описания типа. Имя главной программы, подпрограммы или программной компоненты BLOCK DATA не может встречаться в инструкции описания типа. В инструкции описания типа могут быть описаны типы следующих объектов: переменной, параметра, массива, функции, формального параметра процедуры. Инструкцию описания типа можно использовать и для подтверждения типа, заданного по умолчанию, в целях документирования. 7.2.1. Инструкции описания арифметического и логического типа Инструкции описания арифметического и логического типа имеют вид тип п[9 я]... где тип — это INTEGER, REAL, DOUBLE PRECISION, COMPLEX или LOGICAL, an — имя переменной, параметра, массива, функции, формального параметра процедуры, или
7.2. Инструкции описания типа 79 описатель массива. Инструкция описания типа говорит, что декларируемый в ней объект имеет соответствующий тип. Так, инструкция INTEGER используется для описания объектов целого типа, инструкция REAL — вещественных объектов и т. д. Таким образом, инструкции INTEGER ACAT, 13, FOR(3, — 1:5) REAL J, SUM( — 5:30), DIFF(3,8, 5), QTE DOUBLE PRECISION IDENT, RSLT(IOO) LOGICAL Q, R(0:I0, 5), TLIST, PFLAG COMPLEX OHM (6, — 10:10,1,10), BXER вводят следующие описания: 1. ACAT и 13 — имена целых; FOR —массив целых (описание 13 подтверждает неявное задание типа). 2. J и QTE — имена вещественных; SUM и DIFF — массивы вещественных (описание QTE подтверждает неявное задание типа). 3. IDENT — имя объекта двойной точности; RSLT — массив двойной точности. 4. Q,TLIST и PFLAG — имена логических объектов, R — логический массив. 5. BXER — имя комплексного, OHM — комплексный массив. Вопрос об описателях массивов рассматривался в гл. 4. 7.2.2. Инструкция описания текстового типа Инструкция описания текстового типа имеет вид CHARACTER [* длина [,]] имя [, имя] . . . где длина — описатель длины, задающий длину в литерах текстовой переменной, элемента текстового массива, текстового параметра, результата обращения к текстовой функции, а имя имеет один из видов: я[# длина] м[(р)] [* длина] где п — имя одного из следующих объектов: переменной, параметра, функции или формального параметра процедуры; м — имя массива, м(р) — описатель массива. Описатель длины может быть целой константой без знака, целым константным выражением в скобках, имеющим положительное значение, или звездочкой в скобках.
80 7. Инструкции описания Описатель длины, следующий за словом CHARACTER, обозначает длину всех упомянутых в инструкции объектов, у которых нет собственного описателя длины. Так, в инструкции CHARACTER* 4 LIST,PREFIX* 1, TABLE (100)*8 содержатся следующие описания: LIST имеет описатель длины 4 PREFIX имеет описатель длины 1 TABLE имеет описатель длины 8 Описатель длины, следующий непосредственно за объектом, относится только к этому объекту. Когда декларируется массив, длина относится к каждому его элементу. Если описатель длины отсутствует, как в инструкции CHARACTER A,B длина принимается равной единице. Описатель длины (*) означает, что длина должна быть определена иным образом, и применим только в случаях имен внешних функций, формальных параметров внешних процедур и текстовых параметров. В остальных случаях описатель длины должен иметь вид целой положительной константы или целого выражения в скобках с положительным значением. В случае параметра, как, например, в CHARACTER SFFX*(*) PARAMETER (SFFX= 'AUGUST') длина SFFX берется из значения в инструкции PARAMETER. В данном примере она равна 6. В случае описания формального параметра при определении внешней процедуры, как в случае CHARACTER FUNCTION DELETE(A) CHARACTER A*(*) длина формального параметра (в данном случае А) берется равной длине фактического параметра при вызове процедуры. Если фактический параметр — имя массива, длина берется равной длине его элемента. В случае имени в определении внешней функции, например CHARACTER * (*)FUNCTION FILLUP(A,B) длина имени функции (в данном случае FILLUP) определяется длиной, заданной в вызывающей ее программной компоненте. Если явный описатель длины для внешней функции задан как в вызывающей программной компоненте, так и в описании функции, эти описатели должны быть согласованы или следует в опи-
7.3. Инструкции неявного описания типа имен 81 сании функции использовать описатель (*), как показано выше. Описатель длины текстовой функции-формулы или формального параметра текстовой функции-формулы должен быть всегда целой положительной константой или целым константным выражением с положительным значением. 7.2.3. Пояснения об использовании инструкций описания типа Как указывалось в гл. 2, инструкции описания типа должны располагаться в начале программной компоненты, но им может предшествовать инструкция IMPLICIT. Область действия имен, включая и те, которые входят в инструкции описания типа,— та программная компонента, в которой они встречаются. В программную компоненту может входить несколько инструкций описания типа, начинающихся с одного и того же ключевого слова. Так, инструкции REAL Y12(100), IDENT,BOY(— 5:5) LOGICAL Q,R,S REAL PARTNO(50,2) эквивалентны следующим: REAL Y12(100),IDENT,BOY(—5:5), PARTNO(50, 2) LOGICAL Q, R,S Массивы также могут быть описаны в инструкции DIMENSION. 7.3. ИНСТРУКЦИИ НЕЯВНОГО ОПИСАНИЯ ТИПА ИМЕН, ОПИСАНИЯ ЗНАЧЕНИЙ КОНСТАНТ И ОПИСАНИЯ МАССИВОВ К этой группе можно отнести три инструкции: IMPLICIT, PARAMETER и DIMENSION. Инструкция IMPLICIT служит для изменения или подтверждения правил задания вещественного и целого типа по умолчанию по виду имени и для задания по умолчанию по виду имени других типов. Инструкция PARAMETER используется, чтобы дать константе имя-идентификатор. Инструкция DIMENSION используется для описания массива и задания его размерности. 7.3.1. Инструкция IMPLICIT • Инструкция IMPLICIT имеет вид IMPLICIT тип (а[, а] . . .)[, тип (а[,а] ...)]....
82 7. Инструкции описания где тип — одно из следующих ключевых слов: INTEGER REAL DOUBLE PRECISION COMPLEX LOGICAL CHARACTER [* длина] Здесь ключевое слово задает тип данных, а — это либо одна буква, либо диапазон букв, разделенный знаком минус. Например, инструкция IMPLICIT INTEGER(A,X-Z), REAL(W), DOUBLE PRECISION(B-H,0—V) устанавливает, что имена, начинающиеся с А, с букв от X до Z будут по умолчанию относиться к целому типу, имена, начинающиеся с W, по умолчанию будут относиться к вещественному типу, имена, начинающиеся с букв от В до Н и от О до V, будут относиться к типу «двойная точность». Атрибут длина ключевого слова CHARACTER обозначает описатель длины, в точности как в рассмотренных выше инструкциях описания типа. Например, следующая инструкция: IMPLICIT CHARACTER * 8(C) устанавливает, что имена, начинающиеся с буквы С, будут по умолчанию относиться к типу CHARACTER с описателем длины 8. Декларация неявного задания типа действует только в пределах программной компоненты, в которой она находится, и может отменяться инструкцией описания типа или инструкцией FUNCTION в той же подпрограмме. Инструкция IMPLICIT должна предшествовать всем остальным инструкциям описания, кроме инструкции PARAMETER, и не может быть использована для замены типа встроенных функций. В программной компоненте могут встречаться две и более инструкции IMPLICIT, но каждая буква может использоваться для неявного задания типа только один раз.
7.3. Инструкции неявного описания типа имен 83 7.3.2. Инструкция PARAMETER Инструкция PARAMETER имеет вид PARAMETER (пар=в[,пар=в\ . . .) где пар — идентификатор, г в — константное выражение х). Имя (пар) и константное выражение (в) должны быть согласованы по типу следующим образом: 1. Если тип пар — арифметический, в должно быть арифметическим константным выражением. 2. Если тип пар — логический, в должно быть логическим v константным выражением. 3. Если тип пар—текстовой, в должно быть текстовым константным выражением. 4. Если в константное выражение входит параметр, он должен быть определен ранее в предшествующей или в этой же инструкции PARAMETER. 5. Значение в присваивается параметру пар по правилам, установленным для инструкции присваивания, которые описаны в гл. 8. 6. Параметр должен быть определен в программной компоненте только один раз и в инструкции PARAMETER. 7. Если к имени параметра не должно применяться исходное неявное задание типа, тип параметра должен быть описан явно в инструкции описания типа или быть задан неявно при помощи инструкции IMPLICIT. Описание типа, явное или неявное, должно предшествовать инструкции PARAMETER. 8. Текстовые параметры с длиной, отличной от 1, нуждаются в описателе длины в инструкции CHARACTER или IMPLICIT. Область действия параметра — программная компонента, в которой он описан. После того как параметр определен, его можно использовать как простое выражение в выражении и в инструкции DATA. Параметр нельзя использовать для формирования комплексной константы. Следующий пример иллюстрирует применение инструкции PARAMETER: CHARACTER NAME*(*), PREFIX *3 LOGICAL Q PARAMETER (NAME = <ABC CORP\ PREFIX = 'TLT\ PI = 3.141592818, LINES = 56,Q= .FALSE.) Константа и параметр, вообще говоря, не являются взаимозаменяемыми. Параметр можно использовать только там, где это явно Х) Напомним, что константное значение — это простое выражение, удовлетворяющее определению константного выражения.
84 7. Инструкции описания разрешено, например в качестве простого выражения в выражении или в инструкции DATA. Параметр нельзя использовать, например, для обозначения текстовой константы в инструкции FORMAT. 7.3.3. Инструкция DIMENSION Инструкция DIMENSION имеет вид DIMENSION м{р%м{р)\ . . . где м(р) —описатель массива (см. гл. 4). Несмотря на то что описание каждого массива может встречаться в программной компоненте только один раз, имя массива, описанного в инструкции DIMENSION, может появляться также без информации о размерности в инструкции описания типа или инструкции COMMON. Приведем пример правильных описаний массивов: DIMENSION А(0 : 99), LIST(50,2, —10 : 10) Информация о размерности массива может быть задана описателем массива в инструкциях описания типа и COMMON. 7.4. РАСПРЕДЕЛЕНИЕ ПАМЯТИ В Фортране 77 имеются две инструкции, которые управляют распределением памяти между программными компонентами и внутри программной компоненты. Инструкция COMMON позволяет программным .компонентам совместно использовать блок памяти. Инструкция EQUIVALENCE позволяет связать разные имена с одной и той же физической памятью. 7.4.1. Общая память Отрезок памяти, состоящий из последовательности единиц памяти и используемый программными компонентами совместно, называется общей памятью. Принцип работы с ней следующий: 1. Общая область памяти, доступная двум или более программным компонентам, вводится в употребление инструкцией COMMON. 2. Переменные и массивы размещаются в общей области согласно их расположению в инструкции COMMON. 3. Переменные и массивы, описанные как находящиеся в общей памяти, связываются между собой согласно их описаниям в инструкциях COMMON соответствующих программных компонент. Использование общей памяти предоставляет следующие возможности:
7.4. Распределение памяти 85 1. Пространство, отводимое в памяти под большие таблицы или массивы, можно совместно использовать в нескольких программных компонентах, а не включать таблицу или массив в каждую из них. Таким образом, можно эффективнее расходовать память. 2. Большие объемы данных можно передавать из вызывающей программы в подпрограмму, не используя длинный список параметров. Таким образом, повышается эффективность связи между подпрограммами. Сведения о месте данных в общей памяти можно найти в таблицах распределения. 3. Использование общей памяти позволяет хорошо организовать программу и удобно для программистов. 7АЛЛ. Статическая и динамическая память Статическая память — это память, которая отводится выполняемой программе операционной системой перед началом выполнения программы и остается в распоряжении программы в течение всего времени выполнения. Динамическая память — это память, которая распределяется при входе в блок и освобождается при выходе из него. В Фортране 77 память, отводимая операционной системой главной программе под переменные и массивы,— статическая. Память, отводимая во внешних процедурах (т. е. функциях и подпрограммах),— динамическая, если только при помощи инструкции SAVE не задано противное. 7.4Л.2. Типы общей памяти В Фортране 77 имеются два типа общей памяти: непомеченная и помеченная. Непомеченный общий блок доступен всем программным компонентам, где он описан; он определяется статически. Непомеченный общий блок не имеет имени, он один для всей исполняемой программы. Помеченный общий блок распознается по имени-идентификатору и доступен всем программным компонентам, где описана общая память с таким именем. Он может быть определен статически или динамически в зависимости от того, где описан. Если помеченный общий блок описан в главной программе, он отводится на все время выполнения программы. Если помеченный общий блок описан в подпрограмме, но не описан в вызывающей ее программе, он отводится при входе в программную компоненту и освобождается при выходе из нее. Помеченный общий блок, отведенный в программной компоненте, существует при выполнении всех подчиненных вызовов и возвратов.
86 7. Инструкции описания На рис. 7.1 приведена структура модельной программы, использующей общую память. Исполняемая программа состоит из программных компонент от А до G, где А — главная программа. Структура выполнения программы следующая: 1. А может вызывать В или С. 2. В может вызывать D или Е. 3. С может вызывать F или G. На рис. 7.1 также представлены общие блоки, описанные в программных компонентах от А до G. Непомеченный общий блок и помеченный общий блок ALBL определяются в А и доступны, (главная программа) Описаны: 1. Непомеченный общий блок 2. Помеченный о6-\ ашй блок ALBL I В Описаны: 7. Непомеченный общий блок 2, Помеченный об-\ щий блок BLBL Описаны: Непомеченный общий блок Описаны: Помеченные общие блоки BLBL и ALBL JL Т Описаны: Помеченный общий блок CLBL Описаны: /. Непомеченный общий блок 2. Помеченный об- щий блок CLBL Описаны: Помеченный общий блок ALBL Рис. 7.1. Структура модельной программы, использующей общую память. таким образом, всем программным компонентам, где они описаны. В результате программные компоненты В, D и F имеют доступ к непомеченному общему блоку, а программные компоненты Е и G имеют доступ к помеченному общему блоку ALBL. В программной компоненте В описан помеченный общий блок BLBL, потенциально доступный программным компонентам D и Е. В результате помеченный общий блок BLBL доступен в программной компоненте Е, поскольку он в ней описан. В программной компоненте С описан помеченный общий блок CLBL, потенциально доступный программным компонентам F и G. В результате помеченный общий блок CLBL доступен в программной компоненте F, поскольку он в ней описан.
7.4. Распределение памяти 87 7.4.1.3. Инструкция COMMON Инструкция COMMON имеет вид COMMON ШобУ] список [[у]1[обУ список] . . . где об — имя общего блока, а список — список имен переменных, имен Массивов и описателей массивов. Каждое имя может встречаться только один раз в одной инструкции COMMON. Формальные параметры и имена функций не могут встречаться в инструкции COMMON. Если имя общего блока опущено, общий блок считается непомеченным. Если опущено имя первого из общих блоков, описанных в инструкции COMMON, то и соответствующие косые черточки можно опустить. Список, следующий за именем общего блока, обозначает элементы данных, составляющие этот общий список. Например, инструкция COMMON А, В (5, 5)/DBASE/NAME, ADDR, AGE/DUST/ N, WORK (15), PAY (15) предписывает следующее размещение объектов в общей памяти: А и В помещаются в непомеченный общий блок NAME,ADDR и AGE помещаются в общий блок DBASE N,WORK и PAY помещаются в общий блок DLIST Переменные и массивы общего блока размещаются в общей памяти в том порядке, в каком они перечислены в инструкции СОМ-. MON. Имена переменных и массивов в программных компонентах, ссылающихся на один общий блок, не обязаны быть одинаковыми. Однако объекты должны быть согласованы по порядку, типу и количеству. Две последовательные косые черты обозначают непомеченный общий блок. Например, в инструкциях COMMON A, B/ALBL/C, D//E, F COMMON /ALBL/G,H//I,J переменные A,B,E,F,I и J помещаются в непомеченный общий блок в таком именно порядке. Переменные C,D,G и Н помещаются в общий блок, помеченный ALBL, в таком именно порядке. Список имен переменных и массивов, следующих после каждого из последовательных вхождений имени общего блока, рассматривается как продолжение предыдущего описания общего блока.
88 7. Инструкции описания 7А. 1.4. Организация памяти для общих блоков Общий блок состоит из последовательности единиц памяти. Это единицы памяти объектов из списка переменных и массивов общего блока в том порядке, в каком они написаны в инструкции COMMON. Число единиц памяти, необходимых для хранения общего блока, называется его размером. В выполняемой программе все помеченные общие блоки, описанные в различных программных компонентах под одним и тем же именем, должны иметь одинаковую длину. Непомеченные общие блоки, описанные в разных программных компонентах выполняемой программы, не обязаны иметь одинаковую длину. В выполняемой программе все общие блоки с одним именем имеют общую первую единицу памяти; тем самым устанавливается соответствие между значениями данных в разных программных компонентах. Если текстовая переменная или массив включается в общий блок, этот общий блок должен содержать только текстовые данные. Помеченный общий блок может стать неопределенным при выполнении явного или неявного возврата из внешней процедуры из-за свойств динамической памяти Фортрана 77. Однако при тех же условиях непомеченный общий блок не становится неопределенным. Объектам из помеченного общего блока можно задавать начальные значения в инструкции инициализации DATA. Объекты из непомеченного общего блока, однако, нельзя инициализировать с помощью инструкции DATA. 7.4.2. Эквивалентность памяти Инструкция EQUIVALENCE позволяет отвести под переменные и массивы одни и те же единицы памяти. Эта возможность позволяет разными способами ссылаться на одну и ту же информацию и облегчает участие в написании программы двух или более человек х). Инструкция EQUIVALENCE применима к объектам в пределах одной программной компоненты. 7.4.2.1. Инструкция EQUIVALENCE Инструкция EQUIVALENCE имеет вид EQUIVALENCE (список) [, (список)] . . . где список — это список имен переменных, имен элементов массивов, имен массивов и имен текстовых подцепочек. Любое выра- Х) Автор высказывает здесь устаревшую точку зрения, которая в корне расходится с идеями структурного программирования.— Прим. ред.
7.4. Распределение памяти 89 жение в индексе или указателе подцепочки должно быть целым константным выражением. Например, инструкции REAL C(5),D(6) EQUIVALENCE (C,D(2)) устанавливают такое соответствие: С(1) С(2) С(3) С(4) С(5) ф ф ф ф ф D(l) D(2) D(3). D(4) D(5) D(6) Инструкция EQUIVALENCE позволяет совместить отрезки памяти, занятые объектами, имена которых упоминаются в инструкции EQUIVALENCE. Конкретнее, совмещаются первые единицы памяти элементов из инструкции EQUIVALENCE, что вызывает совмещение также и других элементов. Влияние инструкции EQUIVALENCE ограничивается только установлением соответствия между единицами памяти; эта инструкция никак не влияет на типы и структуры данных. Имена формальных параметров и функций не могут встречаться .в инструкции EQUIVALENCE. Если в инструкции EQUIVALENCE встречается имя массива, соответствие устанавливается точно так же, как если бы был задан его первый элемент. Если в инструкции EQUIVALENCE задан элемент массива, число индексных выражений должно быть равно числу измерений в описании этого массива. 7,4.2.2. Правила использований инструкции EQUIVALENCE При использовании инструкции EQUIVALENCE нельзя задавать такое расположение единиц памяти, которое невозможно физически. В этот разряд попадают следующие случаи: 1. Инструкция EQUIVALENCE не может задавать многократного вхождения одной и той же единицы памяти в отрезок памяти, как в случае REAL X(3),Y EQUIVALENCE(X(2),Y), (X(3), Y) 2. Инструкция EQUIVALENCE не может задавать размещения последовательных единиц памяти в непоследовательных позициях, как в случае REAL X(2) COMPLEX Y(2) EQUIVALENCE (X(l), Y(l)), (X(2)), Y(2)) i
90 7. Инструкции описания Кроме того, инструкция EQUIVALENCE не должна содержать логических противоречий, например нельзя связывать между собой два различных общих блока. 7.4.2.3. Эквивалентность и общая память Можно установить соответствие между переменными и массивами с одной стороны и объектами в общей памяти — с другой. Так, в примере COMMON A,B,C(5) REAL D(7) EQUIVALENCE (A, D(l)) устанавливается следующая эквивалентность памяти: А В С(1) С(2) С(3) С(4) С(5) Ф Ф Ф Ф Ф Ф Ф D(l) D(2) D(3) D(4), D(5) D(6) D(7) и соответствующие единицы находятся в общей памяти. Когда инструкция EQUIVALENCE применяется к переменным и массивам в общей памяти, может потребоваться удлинение общего блока, как в следующем примере: REAL A(8) COMMON C(2), В, D(3) EQUIVALENCE (C(l), A(l)) • при этом блок общей памяти имеет такое строение: А(1) А(2) А(3) А(4) А(5) А(6) А(7) А(8) ФФФФФФФФ С(1) С(2) В D(l) D(2) D(3) * * где звездочка (*) обозначает позиции, на которые удлинился общий блок. Нельзя, однако, в инструкции EQUIVALENCE предписывать такое соответствие, которое удлиняет общую память вставлением единиц памяти перед первой единицей памяти общего блока. Следующая последовательность инструкций: COMMON /LST/I INTEGER K(3) EQUIVALENCE (I, K(2)) является примером некорректного размещения объектов в памяти и недопустима.
7.4, Распределение памяти 91 7.4.2Л. Текстовая эквивалентность Цепочки литер можно совместить при помощи эквивалентности только с другими цепочками литер. Цепочки литер можно задавать как текстовые переменные, имена текстовых массивов, имена элементов текстовых массивов или имена текстовых подцепочек. Совмещаются первые единицы памяти, занятые объектами, входящими в список эквивалентности инструкции EQUIVALENCE, что приводит также к совмещению других текстовых элементов. Следующий пример литерной эквивалентности: CHARACTER A*8,B(3)*2,C*3 EQUIVALENCE (A(2:7),B(1)),(B(2),C) можно представить таким образом: Единицы памяти: Ill2l3l4(5l6l7l8l Переменная А:' | А ■ ■—-| Массив В: J—В(1)—I—В(2)—I—В(3)—I Переменная С: I С 1 7.4.2.5. Эквивалентность массивов В стандарте Фортрана 1966 г. допускалось задание /г-мерного массива как одномерного для определения эквивалентности. В Фортране 77 это запрещено. В Фортране 77 одномерный индекс в списке EQUIVALENCE для n-мерного массива интерпретируется так, как если бы индексное выражение стояло в самой левой позиции, а недостающие индексные выражения принимали значения соответствующих нижних границ. В табл. 7.1 приведены формулы перевода одномерных индексов Фортрана 1966 г. в соответствующие д-мерные индексы. В качестве иллюстрации рассмотрим пример: Фортран 1966 г. Фортран 77 REAL A(3,4) REAL A(3,4) EQUIVALENCE (A(6),B) EQUIVALENCE (A(3,2),B) Обратившись в табл. 7.1, увидим, что индекс для массива А вычисляется в виде (l+MOD(5, 3), 1 +(5)/3), что дает в результате (3,2). В формулах используется тот факт, что массивы хранятся в памяти по столбцам.
92 7. Инструкции описания Таблица 7.1 Формулы перевода одномерного индекса в списке эквивалентности в /г-мерный индекс. (Фортран 1966 г.) п 1 2 3 Размерность (di) WiA) (di,d2,d3) Значение индекса s S S Индекс (s) (l+MODCs-Mi), l-Ks-O/dO (l+MOD(s-l,d!), l+MOD((s-l)/dbd2), l-Ki-l)/(di«da)) J 7.4.2.6. Частичное совмещение Два отрезка памяти п совмещаются, если их соответствующие единицы памяти совпадают. Это означает, что j-я единица памяти первого отрезка памяти та же, что и /-я единица памяти второго отрезка памяти, и (*+&)-я единица памяти первого отрезка та же, что и (/+&)-я единица второго отрезка, для всех &, таких, что (*'+&)-я и (/+&)-я единицы памяти принадлежат соответствующим отрезкам памяти. Два совмещенных объекта совмещены полностью, если совмещаются соответствующие им отрезки памяти; в противном случае они совмещены частично. Для следующих инструкций: COMPLEX А(3) REAL B(4),C DOUBLE PRECISION D EQUIVALENCE (A(2),B(2)),(B(1),C,D) совмещение памяти выглядит так: Единицы памяти: | 1 | 2 I 3 1 4 \ 5 I 6 f Массив А: I А(1) 1 А(2) 1 А(3) 1 Массив В: 1-В(1)- 1НВ(2)- |-В(3) -1—В(4)— I Переменная С: I—С 1 Переменная В: | £) [ В данном случае только В (1) и С совмещены полностью. Все остальные совмещения объектов частичные. Например, А(1) частично совмещается с В(1), С и D; А(2) частично совмещается с В(2), В(3) и D и т. д. х> Определение отрезка памяти см. в гл. Ь
7.5. Инициализация данных 93 Концепция совмещения приложима как к действию инструкции EQUIVALENCE в пределах программной компоненты, так и к действию инструкции COMMON между программными компонентами. 7.4.3. Индексация массивов При управлении памятью необходимо вычислять последовательный номер, по которому осуществляется доступ в массив. Независимо от размерности и границ изменения индексов элементы массива упорядочены в отрезке памяти по столбцам и представляют собой последовательность элементов данных. Во время выполнения программы процессор всегда перед обращением к элементу массива преобразует список индексов в последовательный номер элемента массива. В табл. 7.2 приведен набор формул для вычисления последовательного номера в массиве. Таблица 7.2 Способ вычисления последовательного номера в массиве Размеоностк Описатель ^Snupuuf! Значение Последовательный Размерность размерносШ ^адов индекса ™меР в массиве 1 .(j,:k,) 7t 7t l+(si-j,) 2 <ji:k,,j2:k2) d,,d2 (sbs2) l+(s,-j,H(s2-]2)*d1 3 (Ji:ki,j2:k2,jj:k3) dbd2,d3 (si,s2,s3) l+(st-j|)+(S2-J2)*ds n •Ks3-J3)*di*d1 +(s2-J2)*dl ^(s3^J3)*d2*dj + ... •Ks.rJnWn-1 *dn-2*..:*d, Замечание: dj-krJi+l 7.5. ИНИЦИАЛИЗАЦИЯ ДАННЫХ Для инициализации переменных и элементов массивов при загрузке выполняемой программы может использоваться инструкция DATA. Объекты данных, не упомянутые в инструкции DATA, не определены в момент начала выполнения программы и должны определяться впоследствии до обращения к ним х). 1} Некоторые типичные способы определения объекта данных: с помощью присваивания, ввода или в качестве управляющей переменной DO-цикла или неявного DO-цикла.
94 7* Инструкции описания 7.5.1. Инструкция DATA Инструкция DATA имеет вид DATA спимен/спконст/ [\у]спимен1 спконст!] . . . где спимен — список имен переменных, массивов, элементов массивов, подцепочек и неявных DO-списков, а спконст — список констант вида а[,а\ . . . где каждое а — это константа или параметр либо коэффициент повторения вида я* со следующей за ним константой или параметром, что означает п последовательных вхождений константы или параметра, разделенных запятыми. Например, запись 4*3.14 эквивалентна списку 3.14,3.14,3.14,3.14. Пример инструкции DATA: REAL A(3),B INTEGER R,I(4),P CHARACTER *4 LIST(3) LOGICAL Q COMPLEX С PARAMETER (R-4) DATA A,B/1.23E4,0.,16,0/,I/R*0/,LIST/2*'ABCD\ 'DONE7,Q/.TRUE./,C/(3.4,4.123) Здесь следующие объекты определяются прежде, чем начинает выполняться программа (-е- означает определение): А(1)—1.23Е4,А(2)—0.,А(3)— 16.,В—О 1(1)—0,1(2)—0,1(3)—0,1(4)^—О LIST(l)—'ABCD\ LIST(2)—'ABCD\ LIST(3)—'DONE' Q^-.TRUE.,C— (3.4,4.123) При использовании инструкции DATA необходимо придерживаться следующих правил: 1. Число элементов в спконст должно соответствовать числу объектов, заданных в спимен. 2. Формальные параметры, имена функций и объекты из непомеченного общего блока не должны упоминаться в инструкции DATA. 3. Имена объектов из помеченного общего блока могут упоминаться в инструкции DATA только в программной компоненте BLOCK DATA. . Инициализация данных достигается присваиванием первого значения из спконст первому объекту из спимен, второго значения
7.5. Инициализация данных 95 из спконст второму объекту из спимен и т. д. Поэтому тип объекта в спимен должен быть согласован с соответствующим значением в спконст. Конкретнее, если объект в спимен — арифметический, соответствующее значение в спконст должно быть арифметическим; если необходимо, производится преобразование типов. Если объект в спимен — логический, соответствующее значение в спконст должно быть логическим. Аналогично, если объект в спимен текстовой, соответствующее значение в спконст должно быть текстовым. Любые выражения, входящие в объекты из спимен, такие, как индексы или выражения в подцепочках, должны быть целыми константными выражениями. На инициализации текстовых объектов следует остановиться особо. Если атрибут «длина» текстового объекта из спимен больше длины соответствующей текстовой константы, текстовой объект дополняется пробелами справа. Если атрибут «длина» текстового объекта из спимен меньше длины соответствующей текстовой константы, левые литеры константы сохраняются, а лишние литеры справа игнорируются. Каждая текстовая константа используется для инициализации одного и только одного текстового объекта. 7.5.2. Неявные DO-списки Элемент спимен может представлять собой неявный DO-спи- сок для инициализации элементов массива. Неявный DO-список имеет вид (do-cn, i=mu m2[, m3]) где do-cn — список имен элементов массивов или неявных DO-списков и i, mu т2 и т3 задают управляющую информацию, а именно: i — целая переменная, используемая в качестве управляющей (использование переменной i не влияет на ее определенность в программе); mi — начальное значение, заданное целым константным выражением; т2 — предельное значение, заданное целым константным выражением; /Пз — значение приращения, заданное целым константным выражением. (Если т3 опущено, приращение по умолчанию считается равным 1.) Число итераций неявного DO-списка должно быть положительным. Целые константные выражения, используемые в качестве mi, m2 и /л3, могут включать управляющие переменные других
96 7. Инструкции описания неявных DO-списков. Примеры инструкций DATA с неявными DO-списками: DATALIMIT/1000/,(A(I),I-l,25)/25*0./ DATA((A(I>J),J = 1,5),I=1,10)/50*1.1/ DATA(X(U),I = 1,100)/100*1.1/ DATA((A(I>J),J = 1>I),I=1,3)/4*0.,25.3>4E —6/ DO-циклы будут рассмотрены в гл. 9. 7.5.3. Программная компонента BLOCK DATA Программная компонента BLOCK DATA x) дает возможность инициализировать переменные и массивы из помеченных общих блоков. Структура программной компоненты BLOCK DATA такова: BLOCK DATA [подпр] • < инструкции описания END По этой схеме программная компонента BLOCK DATA начинается с инструкции BLOCK DATA, заканчивается инструкцией END и может включать только следующие инструкции описания: IMPLICIT, PARAMETER, DIMENSION, COMMON, SAVE, EQUIVALENCE, DATA и инструкция описания типа. Допускаются также строки комментариев. Поскольку программная компонента BLOCK DATA обрабатывается независимо 2) от остальных программных компонент, при инициализации любой переменной или элемента массива из помеченного общего блока надо описывать весь этот общий блок. . Инструкция BLOCK DATA имеет вид BLOCK DATA [подпр] где подпр — имя программной компоненты BLOCK DATA, в которую входит эта инструкция. Имя подпр может быть опущено. Оно является внешним именем программной компоненты и должно быть уникально. Так, никакие две программные компоненты BLOCK DATA не должны иметь одно и то же внешнее имя, хотя в выполняемую программу может входить более одной подпро- х> Программную компоненту BLOCK DATA обычно называют подпрограммой BLOCK DATA. Однако термин «программная компонента», видимо, точнее. 2) Обычно под этим понимается тот факт, что подпрограмма BLOCK DATA компилируется независимо от остальных программных компонент.
7.6. Инструкции описания, относящиеся к подпрограммам 97 граммы BLOCK DATA. Однако выполняемая программа не может содержать более одной неименованной программной компоненты BLOCK DATA. Следующий пример иллюстрирует применение аппарата BLOCK DATA: BLOCK DATA LMDATA REAL DISP(10,50) INTEGER ROWS,COLS COMMON/LMAT/ROWS,COLS,DISP DATA ROWS,COLS/10,50/, ((DISP(I,J)fI= 1,10),J - 1,50)/500*0.01/ END Приведем инструкцию DATA, которая делает то же, что и инструкция DATA в программной компоненте BLOCK DATA: DATA ROWS,COLS/10,50/,DISP/500*0.1/ При помощи программной компоненты BLOCK DATA можно инициализировать только переменные и элементы массивов из помеченных общих блоков. 7.6. ИНСТРУКЦИИ ОПИСАНИЯ, ОТНОСЯЩИЕСЯ К ПОДПРОГРАММАМ В целом инструкции описания применимы в равной степени ко всем типам программных компонент^ Три инструкции, однако, относятся именно к подпрограммам: EXTERNAL, SAVE и INTRINSIC. Инструкция EXTERNAL используется для обозначения того, что некоторое имя — это имя внешней процедуры или формального параметра-процедуры. Инструкция SAVE позволяет сохранить значения переменных и массивов после выполнения в подпрограмме инструкции RETURN или END и тем самым оставить их определенными для последующих вызовов подпрограммы или для использования их как данных из помеченного общего блока. Инструкция INTRINSIC позволяет указать, что некоторое имя — это- имя стандартной функции. 7.6.1. Инструкция EXTERNAL Инструкция EXTERNAL имеет вид EXTERNAL проц [,проц] . . » где проц — имя внешней процедуры, имя формального параметра-процедуры или программной компоненты BLOCK DATA. Инструкция EXTERNAL часто используется для замены стандартной функции внешней процедурой, написанной пользовате- 4 Г.Катцан
98 7. Инструкции описания лем. Кроме того, эта инструкция применяется для объявления идентификатора именем внешней процедуры, чтобы его можно было передать подпрограмме, как в этом примере: EXTERNAL ABFCN CALL ANYFCN(A,M,N,ABFCN) Поскольку программная компонента, в которой встретилась инструкция CALL, независима от ABFCN, это имя без инструкции EXTERNAL распознается не как имя внешней функции, а как имя переменной. Инструкция EXTERNAL, по существу, сообщает процессору, что ABFCN — внешняя процедура, а не переменная. Если же в инструкции EXTERNAL встретилось имя стандартной функции, то это имя в данной программной компоненте не будет рассматриваться как имя стандартной функции. 7.6.2. Инструкция SAVE Инструкция SAVE имеет вид SAVE[al9al . Л где каждое а обозначает один из следующих объектов: 1. Имя помеченного общего блока, перед и после которого стоит наклонная черта, например SAVE/LMAT/ 2. Имя переменной или массива, например SAVE A,B Если список не задан, инструкция SAVE обрабатывается так, как если бы список включал все допустимые объекты в этой программной компоненте. Действие инструкции SAVE заключается в том, что перечисленные в ней переменные, массивы и общие блоки не окажутся неопределенными после выполнения в подпрограмме инструкции RETURN или END. Если переменная или массив, заданные в инструкции SAVE, локализованы в подпрограмме и определены к моменту выхода из нее, их значения сохранятся к моменту следующего вызова подпрограммы. Обычно при выходе из подпрограммы все переменные и массивы становятся неопределенными. Исключение составляют только следующие случаи: 1. Переменные и массивы, заданные в инструкции SAVE. 2, Переменные и массивы из непомеченного общего блока, который, по существу, связан с главной.программой.
7,6. Инструкции описания, относящиеся к подпрограммам 99 3. Переменные и массивы из помеченного общего блока, который описан и в подпрограмме, и в вызывающей программной компоненте. Таким образом, состояние определенности всех объектов, декларированных в главной программе, непрерывно поддерживается в процессе выполнения всей выполняемой программы. Инструкция SAVE может встретиться в главной программе, но она ни на что не повлияет. Кроме того, формальные параметры и имена процедур не могут встречаться в инструкции SAVE. Инструкцию SAVE с помеченным общим блоком следует использовать с осторожностью. Случай, когда помеченный общий блок описан в главной программе, рассмотрен выше. В подпрограмме значения переменных и массивов из помеченного общего блока сохраняют свое состояние определенности после выхода, если помеченный общий блок был упомянут в инструкции SAVE. Однако при выходе из другой подпрограммы, вызывающей эту и имеющей доступ к тому же помеченному общему блоку без соответствующей инструкции SAVE, переменные и массивы из помеченного общего блока потеряют свое состояние определенности. Таким образом, инструкцию SAVE, в которой задан помеченный общий блок, следует включать в каждую подпрограмму, имеющую доступ к этому общему блоку. Каждое имя может встречаться только в одной инструкции SAVE в пределах одной программной компоненты. 7.6.3. Инструкция INTRINSIC Инструкция INTRINSIC имеет вид INTRINSIC функц [, функц] , . • где функц — имя стандартной функции. Если некое имя упоминается в инструкции INTRINSIC, оно тем самым декларируется как имя стандартной функции.- Чаще всего эта инструкция используется для того, чтобы можно было передать подпрограмме имя стандартной функции, например INTRINSIC SIN CALL DOFCN(A,M,N,SIN) при вызове следующей подпрограммы: SUBROUTINE DOFCN(ARRAY,ROWS,COLS,FCN) REAL ARRAY(ROWS,COLS) INTEGER ROWS,COLS DO 5 1=1,ROWS D0 5J = l,COLS 4»
I oo 7. Инструкции описания 5 ARRAY(I,J) = FCN(ARRAY(I,J)) RETURN END Подпрограмма применяет функцию к каждому элементу массива. Как и в случае инструкции EXTERNAL, инструкция INTRINSIC не позволяет завести переменную вместо функции, заданной в качестве фактического параметра в вызывающей программной компоненте. Имеют место некоторые очевидные ограничения. Прежде всего в пределах одной программной компоненты никакое имя не может встречаться одновременно в инструкциях INTRINSIC и EXTERNAL. Во-вторых, стандартные функции, реализованные методом генерации вставок в объектную программу, не могут упоминаться в инструкции INTRINSIC. К этой категории относятся стандартные функции преобразования типов (INT, IFIX, IDINT, FLOAT, SNGL, REAL, DBLE, CMPLX, ICHAR и CHAR) и стандартные функции выбора наибольшего и наименьшего значения (МАХ, МАХО, АМАХ1, АМАХО, МАХ1, MIN, MINO, AMIN1, DMIN1, AMINO и MINI). Наконец, каждое имя стандартной функции может встречаться только в одной инструкции INTRINSIC в пределах программной компоненты. Появление имени стандартной функции в инструкции INTRINSIC никак не влияет на свойства самого этого имени.
8 ИНСТРУКЦИИ ПРИСВАИВАНИЯ 8.1. ОБЩИЙ ОБЗОР Инструкция присваивания используется для присваивания значения переменной или элементу массива, после чего этот объект становится определенным. В Фортране 77 имеются три вида присваиваний: арифметическое, логическое и текстовое. К ним вплотную примыкает инструкция ASSIGN, с помощью которой целой переменной присваивается значение метки инструкции. 8.2. АРИФМЕТИЧЕСКОЕ ПРИСВАИВАНИЕ Арифметическая инструкция присваиваний используется для присваивания значения арифметического выражения арифметической переменной или элементу массива. Арифметическая инструкция присваивания имеет вид пер = выр где пер — имя арифметической переменной или элемента арифметического массива, а выр — арифметическое выражение, вычисленное в том месте, где оно встретилось. Тип пер должен быть целым, вещественным, двойной точности или комплексным. Во время присваивания меняется только значение объекта слева от знака равенства, а значения объектов, входящих в выражение, сохраняются. Фортран 77 допускает преобразование типов объектов, находящихся по разные стороны знака равенства, как показано в следующем примере: 1 = 5 (1) J-6 (2) A=I*J + 1 ' (3) В инструкциях (1) и (2) I присваивается значение 5 и J присваивается значение 6. В инструкции (3) вычисляется целое значение 31 выражения I*J + 1; это значение преобразуется из целого в вещественное и старое значение А заменяется значением вещественного типа, равным 31. Правила преобразования для арифметического присваивания вида пер = выр собраны в табл. 8.1. Они, по существу, подразумевают применение внутренних функций, которые перечислены в приложении А.
102 8, Инструкции присваивания Таблица 8.1 Правила преобразования для арифметического присваивания пер= вырХ) Тип пер Целый Вещественный Двойной точности Комплексный Присваиваемое значение INT (выр) REAL (выр) DBLE (выр) CMPLX (выр) , *) В зависимости от конкретной внутренней функции (FCN)* используемой для преобразования, FCN (выр) может равняться выр, как в случае присваивания целого значения целой переменной. Внутренние функции INT, REALt DBLE и CMPLX описаны в приложении А. 8.3. ЛОГИЧЕСКОЕ ПРИСВАИВАНИЕ Логическая инструкция присваивания используется для присваивания значения логического выражения логической переменной или элементу массива. Логическая инструкция присваивания имеет вид. пер = выр где пер — имя логической переменной или элемента логического массива, а выр — логическое выражение, вычисленное в том месте, где оно встретилось. Приведем примеры логических инструкций присваивания: LOGICAL P,Q,R,S,T REAL A,B,C INTEGER I,J,K CHARACTER U*5,V*2 P=^.TRUE. Q = A.GT. В R = I .NE. J .AND. Q S=A + B XE. С .AND.(I + J)**2 + K .GT. 15 .OR. P T-V.EQ. U(3:5) При логическом присваивании значением выражения выр должна быть «истина» или «ложь».
8.5. Инструкция ASSIGN 8.4. ПРИСВАИВАНИЕ ЛИТЕРНЫХ ЦЕПОЧЕК Текстовая инструкция присваивания используется для щ сваивания значения текстового выражения текстовой переме ной, элементу массива или подцепочке. Текстовая инструкц присваивания имеет вид пер = выр где пер — имя текстовой переменной, элемента *текстового w< сива или подцепочки, а выр — текстовое выражение, вычисле ное в том месте, где оно встретилось. При вычислении текстово выражения выр и присваивании его значения пер никакая изменяющихся (т. е. определяемых) литерных позиций в пер должна использоваться при вычислении выр. Если длина et меньше длины пер, значение выр дополняется справа пробела! до длины пер. Если длина выр больше длины пер, значение et при присваивании укорачивается справа. Примеры текстовь присваиваний: CHARACTER U*5,V*3,W*7 V='ABC U = V//'DE' W(4:5) = V(2:3) Присваивание подцепочке определяет только те литерные поз] ции, которым делается присваивание. 8.5. ИНСТРУКЦИЯ ASSIGN Инструкция ASSIGN используется для присваивания цело переменной значения метки инструкции и имеет вид ASSIGN м to i где м — метка исполняемой инструкции или инструкции FOR МАТ из той же программной компоненты, что и инструкци ASSIGN, a i — имя целой переменной. Например: ASSIGN 5320 to IJUMP Когда целой переменной присвоено значение метки, ее нельз использовать в качестве арифметической переменной. Целу* переменную, которой была присвоена метка, можно использоват только в качестве указателя инструкции в инструкции переход по предписанию или для задания формата в инструкции ввода вывода.
104 8. Инструкции присваивания Целую переменную, которой было присвоено значение метки, можно переопределить как арифметическую и соответствующим образом к ней обращаться. 8.6. РАЗНЫЕ ЗАМЕЧАНИЯ О ПРИСВАИВАНИИ Многократное присваивание в одной инструкции и использование знака присваивания (т. е. = ) внутри выражения в Фортране 77 не разрешаются.
9 ИНСТРУКЦИИ УПРАВЛЕНИЯ 9,1. ОБЩИЙ ОБЗОР Выполнение инструкции управления влияет на порядок исполнения инструкций в программной компоненте. Как уже говорилось ранее, обычно инструкции выполняются последовательно в том порядке, в каком они встречаются в программной компоненте. Инструкции управления позволяют изменять такую последовательность. В этой главе рассмотрены все инструкции управления, кроме CALL и RETURN; о них будет рассказано, когда речь пойдет о подпрограммах. 9.2. ИНСТРУКЦИИ ПЕРЕХОДА Инструкции перехода используются для передачи управления в программе на исполняемую инструкцию с меткой, указанной в соответствующей инструкции перехода. В Фортране 77 имеются три типа инструкций перехода: инструкция безусловного перехода, инструкция вычисляемого перехода и инструкция перехода по предписанию. 9.2.1. Инструкция безусловного перехода Инструкция безусловного перехода имеет вид GOTO м где м — метка исполняемой инструкции из той же программной компоненты, что и инструкция безусловного перехода. Напри- . мер; GOTO 154 Когда процессор выполняет инструкции безусловного перехода, управление в программе передается на заданную инструкцию и с этой точки продолжается обычное последовательное выполнение.
106 9. Инструкции управления 9.2.2. Инструкция вычисляемого перехода Инструкция вычисляемого перехода имеет вид GOTO(jk[,*1 . . .)1М Где i — целое выражение, а м — метка исполняемой инструкции из той же программной компоненты, что и инструкция вычисляемого перехода. Среди заданных меток могут быть повторяющиеся. Пример инструкции вычисляемого перехода: GOTO(100, 200,200,250, 9000),KJMP+1 Инструкция вычисляемого перехода выполняется так: 1. Целое выражение, обозначенное выше через i9 вычисляется в том месте, где оно встретилось. 2. Управление в программе передается на инструкцию, помеченную i-й меткой из списка меток в инструкции вычисляемого перехода. Точнее, в случае инструкции вычисляемого перехода вида <ЗОТО(мим2, ... >Mn),i управление в программе передается на исполняемую инструкцию с меткой Mif если l^i^/i. Если же *<1 или 1>п, выполнение программы продолжается с инструкции, следующей за инструкцией вычисляемого перехода. 9.2.3. Инструкция перехода по предписанию Инструкция перехода по предписанию имеет вид ООТОШ,](л*и]. • -)1 где I — целая переменная, значение которой — метка, а ж — метка выполняемой инструкции из той же программной компоненты, что и инструкция перехода по предписанию. Например: GOTO LBRNCH,(100,400,14990) Когда процессор исполняет инструкцию перехода по предписанию, управление в программе передается на исполняемую инструкцию с меткой, значение которой было присвоено целой переменной, указанной в инструкции перехода по предписанию, и обычное последовательное выполнение продолжается с этого места. Если в инструкции присутствует заключенный в скобки список меток, то метка, значение которой присвоено t, должна входить в этот список. Одна и та же метка может упоминаться в списке более одного раза.
9.3* Инструкции условного перехода 107 9.3. ИНСТРУКЦИИ УСЛОВНОГО ПЕРЕХОДА Инструкции IF в Фортране 77 служат для условного выполнения частей программы. Арифметическая инструкция IF реализует условное ветвление, логическая инструкция IF — условное выполнение инструкции. Инструкции IF-THEN-ELSE реализуют условное выполнение фрагментов программы. 9.3.1. Арифметическая инструкция IF Арифметическая инструкция IF имеет вид IF (выр) ми м2, м3 где выр — арифметическое выражение, целое, вещественное или с двойной точностью, но не комплексное, а ми м2, м3 — метки исполняемых инструкций из той же программной компоненты, что и эта арифметическая инструкция IF. Одну и ту же метку можно использовать в одной арифметической инструкции IF более одного раза. Пример: 1F((A+B)**2—С) 100,200,300 Арифметическая инструкция IF выполняется так: 1. Выражение выр вычисляется в том месте, где оно встречается. 2. Управление передается на инструкцию с меткой ми м2 или Мз, если значение выр соответственно отрицательно, равно нулю или положительно. После передачи управления по одной из заданных меток продолжается нормальное последовательное выполнение программы. 9.3.2. Логическая инструкция IF Логическая инструкция IF имеет вид IF (выр) инстр где выр — логическое выражение, а инстр — любая исполняемая инструкция, кроме DO, структурной инструкции IF, ELSE IF, ELSE, END IF, END или другой логической инструкции IF. Примеры: IF(R .LE. EPS) GO TO 4320 IF(A .LT.0.)A = 0.0 IF(Q)CALL MATMPY(A,M,N,B,C) Логическая инструкция IF выполняется так: 1. Логическое выражение выр вычисляется в том месте, где оно встречается.
108 9. Инструкции управления 2. Если значение выр истинно, выполняется инстр. Если значение выр ложно, выполнение продолжается с инструкции, следующей за этой логической инструкцией IF. Вычисление логического выражения выр и выполнение инстр независимы в том смысле, что обращение к функции в выр может влиять на переменные, входящие в состдв инструкции инстр. 9.3.3. Конструкция IF-THEN-ELSE Структура блока IF-THEN-ELSE такова: IF (выр) THEN [блок исполняемых инструкций] Это IF-блок ELSE [блок исполняемых инструкций] Это ELSE-блок END IF где ELSE-блок может быть опущен. Возможна и такая структура: IF (выр) THEN [блок исполняемых инструкций] Это IF-блок ELSE IF (выр) THEN- [блок исполняемых инструкций] Это ELSE IF-блок [другие ELSE IF-блоки] ELSE [блок исполняемых инструкций] Это ELSE-блок END IF где опять же ELSE-блок может быть опущен. 9.3.3.1. Уровень инструкции Для правильного выполнения конструкции IF-THEN-ELSE нужен механизм, позволяющий определять, какие из инструкций IF-THEN-ELSE соответствуют друг другу. Этот механизм называется «уровнем» инструкции. Уровень инструкции s равен Пг—п2у где пу — число структурных инструкций IF {эта инструкция описана ниже) от начала программной компоненты до s включительно, а п2 — число инструкций END IF в программной компоненте до s, но не включая s. Таким образом, уровень любой инструкции должен быть положительным или нулевым, уровень
9.3. Инструкции условного перехода 109 структурных инструкций IF, инструкций ELSE IF, ELSE и END IF должен быть положительным. Уровень инструкции END программной компоненты должен быть нулевым. 9.3.3.2. Структурная инструкция IF Структурная инструкция IF имеет вид IF (выр) THEN где выр — логическое, выражение, вычисляемое в том месте, где оно встретилось. Структурная инструкция IF выполняется профессором так: 1. Вычисляется логическое выражение выр. 2. Если значение выр истинно, выполнение продолжается с первой, инструкции IF-блока 1}. После выполнения последней инструкции IF-блока управление в программе передается на следующую инструкцию END IF с тем же уровнем, что и у соответствующей инструкции IF. Если IF-блок пуст, управление сразу же передается на следующую инструкцию END IF с тем же уровнем, что и у соответствующей инструкции IF. Если последняя инструкция IF-блока выполняет передачу управления в другую часть программной компоненты, эта управляющая инструкция выполняется соответствующим образом. 3. Если значение выр ложно, выполнение продолжается со следующей инструкции ELSE IF, ELSE или END IF с тем же уровнем, что и у инструкции IF. Управление не может быть передано внутрь IF-блока. 9.3.3.3. Инструкция ELSE IF Инструкция ELSE IF имеет вид ELSE IF (выр) THEN где выр — логическое выражение, вычисляемое в том месте, где оно встретилось. Процессор выполняет инструкцию ELSE IF так: 1. Вычисляется логическое выражение выр. 2. Если значение выр истинно, выполнение продолжается с первой инструкции ELSE IF-блока 2). После выполнения послед- х> IF-блок определяется как последовательность исполняемых инструкций, следующих за структурной IF-инструкцией до следующей инструкции ELSEIF, ELSE или END IF (не включая ее) с тем же уровнем, который имеет эта инструкция IF. IF-блок может не содержать инструкций, т. е. быть пустым. 2> ELSE IF-блок определяется как последовательность выполняемых инструкций, следующих за инструкцией ELSE IF до следующей инструкции ELSE IF, ELSE или END IF (не включая ее) того же уровня, что и у инструкции ELSE IF. ELSE IF-блок может не содержать инструкций, т. е. может быть пустым.
ПО 9. Инструкции управления ней инструкции в ELSE IF-блоке управление передается на следующую инструкцию END IF того же уровня, что и у инструкции ELSE IF. Если ELSE IF-блок пуст, управление сразу же передается на следующую инструкцию END IF того же уровня, что и у инструкции ELSE IF. Если последняя инструкция ELSE IF- блока выполняет передачу управления в другую часть программной компоненты, эта управляющая инструкция выполняется соответствующим образом. 3. Если значение выр ложно, выполнение продолжается со следующей инструкции ELSE IF, ELSE или END IF того же уровня, что и у инструкции ELSE IF. Управление не может быть передано внутрь ELSE IF-блока. 9.3.3.4. Инструкция ELSE Инструкция ELSE имеет вид ELSE Управление передается в ELSE-блок х> при ложном значении логического выражения в структурной инструкции IF или инструкции ELSE IF. Если управление передается в ELSE-блок, продолжается обычное последовательное выполнение вплоть до инструкции END IF. Управление не может быть передано внутрь ELSE-блока. 9.3.3.5. Инструкция END IF Инструкция END IF имеет вид END IF Инструкция END IF отмечает место в программе и не выполняет никаких действий. Для каждой структурной инструкции IF в программной компоненте должна существовать своя инструкция END IF. 9.3.3.6. Замечания и пример Метку инструкции ELSE IF или ELSE нельзя использовать для передачи управления на эти инструкции. Для инструкции END IF такого ограничения нет. х> ELSE-блок определяется как последовательность исполняемых инструкций, следующих за инструкцией ELSE до следующей инструкции END IF (не включая ее) того же уровня, что и у этой инструкции ELSE. ELSE-блок может не содержать инструкций, т. е. быть пустым.
9,4. Инструкция DO 111 На рис. 9.1 приведена блок-схема пояснительного примера. Представлением этой блок-схемы является следующий фрагмент Истина <^~? Рис. 9.1. Пример инструкций IF-THEN-ELSE. программы на Фортране 77: IF (Q) THEN А = В- C = D ELSE IF (R) THEN E = F G = H ELSE X = Y z = w END IF IF-, ELSE IF-, ELSE- и END IF-блоки могут быть вложены с учетом описанных выше правил для уровней. Допускается вложенность любого уровня, какая может понадобиться в конкретных приложениях. 9.4. ИНСТРУКЦИЯ DO Инструкция DO используется для задания управляемого цикла, введения управляющей переменной, параметров индекси-
112 9. Инструкции управления рования и указания границ тела цикла. В Фортране 77 управляемый цикл называется DO-циклоМ. Инструкция DO имеет вид DOм[,]1 = выри выр21,вырз\ где м — метка последней инструкции тела цикла; i — имя целой, вещественной или с двойной точностью переменной, которая в Фортране 77 называется DO- переменной; вырг — целое, вещественное или с двойной точностью выражение, представляющее начальное значение DO-перемен- ной; выр2 — целое, вещественное или с двойной точностью выражение, представляющее предельное значение DO-nepe- менной; выр3 — целое, вещественное или с двойной точностью выражение, представляющее значение приращения для DO-переменной. Пример правильной инструкции DO: DO 500 U=A+1,SQRT(B),EPS/100 9.4.1. Структура DO-цикла Тело DO-цикла состоит из последовательности исполняемых инструкций, следующих за инструкцией DO до инструкции с меткой м включительно. Строение цикла DO подчиняется следующим правилам: 1. Циклы DO могут быть вложены, но не могут перекрываться. 2. Если структурная инструкция IF лежит в теле DO-цикла, то и соответствующая инструкция END IF тоже должна лежать в теле этого DO-цикла. 3. Если инструкция DO встречается в IF-блоке, ELSE IF- блоке, ELSE-блоке, то и весь DO-цикл (т. е. тело DO-цикла) должен входить целиком в этот блок. 4. Инструкция с меткой м в DO-цикле не может быть ни одной из следующих инструкций: безусловный переход, переход по предписанию, вычисляемый переход, арифметическая или структурная инструкция IF, ELSE IF, ELSE, END IF, RETURN, STOP, END или другая инструкция DO. Если инструкция с меткой м — Логическая инструкция IF, то она может содержать в себе любую исполняемую инструкцию, кроме следующих: DO, структурная инструкция IF, ELSE IF, ELSE, END IF, END или другая логическая инструкция IF. Одна и та же инструкция может быть заключительной для двух и более вложенных DO-циклов.
9.4. Инструкция DO 113 9.4.2. Выполнение DO-цикла Назначение DO-цикла — выполнить исполняемые инструкции из тела цикла некоторое число раз. Это число определяется управляющими параметрами, заданными в инструкции DO. Процесс выполнения DO-цикла включает такие шаги: 1. Выполнение инструкции DO и вход в DO-цикл. 2. Подсчет числа итераций. 3. Проверка числа итераций. 4. Выполнение инструкций, находящихся в теле DO-цикла. 5. Операции по управлению циклом. 6. Выход из DO-цикла. Вход в DO-цикл осуществлялся при выполнении инструкции DO. В этот момент вычисляются выражения выри выр2 и выр3 и определяются соответствующие управляющие параметры пари пар2 и naps. Выражения выри выр2 и выря преобразуются к типу переменной I, если типы не согласованы. Приращение пар3 не может быть нулем и по умолчанию равно единице. Число итераций получается как значение следующего выражения: МАХ(ШТ((пар g—пар i+пар з)/пар 3),0) Приращение может быть положительным или отрицательным, начальное и предельное значения могут принимать соответствующие значения. Если парх>паръ число итераций в самом начале равно нулю при пар3>0. Аналогично, число итераций в самом начале равно нулю, когда пар\<лар2 и пар3<0. Обработка цикла начинается с проверки числа итераций. Если оно равно нулю, осуществляется выход из DO-цикла и выполнение продолжается с первой исполняемой инструкции, следующей за последней инструкцией этого DO-цикла. Если заключительная инструкция — общая для нескольких DO-циклов, продолжается обработка приращений. Если число итераций положительно, инструкции, составляющие DO-цикл, выполняются последовательно, пока не будет обработана заключительная инструкция. Это одна итерация цикла, после которой требуется произвести приращение. Процесс обработки приращений включает следующие шаги: 1. Значение переменной цикла изменяется на значение приращения пар3. 2. Число итераций уменьшается на 1. 3. Повторяется описанная выше процедура обработки цикла. Управляющие параметры не могут быть изменены во время выполнения DO-цикла, поскольку число итераций определено в са-
114 9. Инструкции управления мом начале. Управляющую переменную нельзя переопределять во время выполнения DO-цикла. Выход из DO-цикла происходит тогда, когда число итераций уменьшится до нуля. Другие причины выхода из DO-цикла:. 1. Выполнение инструкции RETURN внутри тела DO-цикла. 2. Выполнение инструкции, передающей управление за пределы тела DO-цикла. 3. Выполнение инструкции STOP или ненормальное завершение программы. Обращение к подпрограмме из тела DO-цикла или из инструкции DO не влечет выхода из DO-цикла. При выходе из DO-цикла переменная цикла сохраняет последнее присвоенное ей значение. Войти в DO-цикл можно только через инструкцию DO. 9.5. ИНСТРУКЦИЯ CONTINUE Инструкция CONTINUE обозначает точку для ссылки в программе на Фортране, при ее выполнении не происходит никаких действий, Она имеет вид CONTINUE Инструкция CONTINUE часто используется в качестве заключительной инструкции DO-цикла, как в этом примере: DO 50 1 = 1,N IF(X(I) .LT. 0.)GOTO 50 SUM = SUM+X(I) PROD = PROD*X(I) 50 CONTINUE 9.6. ИНСТРУКЦИИ STOP И PAUSE Инструкция STOP имеет вид STOP [n] где n — целая константа не более чем из пяти цифр или текстовая константа. Когда процессор выполняет инструкцию STOP, выполнение программы завершается, а значение п остается доступным и используется так, как предусмотрено реализацией. Инструкция PAUSE имеет вид PAUSE In] где п — целая константа не более чем из пяти цифр или текстовая константа. Когда процессор встречает инструкцию PAUSE, выполнение программы прекращается, но может быть возобновлено.
9.7, Инструкция END 115 Значение п доступно в целях, зависящих от особенностей реализации. Программа не может сама возобновить свою работу после выполнения инструкции PAUSE. Выполнение инструкции PAUSE никак не влияет на ход дальнейшего выполнения программы после того, как оно будет возобновлено. 9.7. ИНСТРУКЦИЯ END Инструкция END обозначает физический конец программной компоненты. В главной программе она выполняется так же, как инструкция STOP, а в подпрограмме — как инструкция RETURN. Инструкция END имеет вид END и записывается в позициях с 7-й по 72-ю с новой строки. Никакая другая инструкция не может начинаться с букв END.
10 ввод и вывод. ОСНОВНЫЕ ПОНЯТИЯ 10.1. СРЕДСТВА ВВОДА И ВЫВОДА Возможности ввода и вывода в Фортране 77 по сравнению со стандартом Фортрана 1966 г. расширены и включают средства для работы с внутренними файлами и файлами прямого доступа, а также ряд дополнительных удобств, облегчающих программирование операций ввода и вывода на Фортране и позволяющих программисту осуществлять более прямой контроль над системой ввода-вывода. Реализация инструкций ввода и вывода для языка Фортран 77 в большой степени зависит от процессора и от операционной среды. По этой причине в данной главе, а также в последующих главах, посвященных системе ввода-вывода в Фортране 77, рассматриваются главным образом те вопросы организации ввода и вывода, которые представляют интерес с точки зрения программиста. 10.2. ЗАПИСИ Система ввода-вывода языка Фортран 77 основывается на понятии записи в том смысле, что в результате исполнения каждой инструкции READ читается одна запись, а в результате исполнения инструкции WRITE или PRINT записывается или печатается одна запись. Записью называется последовательность значений данных или последовательность литер, и ей не обязательно должно соответствовать какое-то определенное физическое представление. В Фортране 77 под словом «запись» подразумевается «логическая запись» в противоположность понятию физической записи. Более подробно, при каждом исполнении инструкции READ открывается доступ к очередной записи с заданного канала, который фактически может оказаться цепочкой литер в памяти. Объем данных, выбираемых из вводной записи, определяется списком ввода. Лишние данные игнорируются. Если в записи не хватает данных для списка ввода, то имеет место ошибка. При каждом исполнении инструкции WRITE или PRINT записывается или печатается одна или более записей на указанное устройство, которое также может оказаться областью в памяти. Объем данных, которые выводятся инструкцией WRITE или PRINT, определяется списком вывода и соответствующей специ-
10.3. Файлы 117 фикацией FORMAT, если она есть. Запись может иметь нулевую длину. В Фортране 77 допускаются записи трех видов: форматные записи, бесформатные записи и записи конца файла. 10.2.1. Форматные записи Форматные записи используются в тех случаях, когда нужно прочитать исходные данные, напечатать информацию в удобной для человеческого восприятия форме или запомнить данные в некотором внешнем-представлении, например в виде десятичных цифр в двоичном коде. Данные в форматной записи редактируются как при вводе, так и при выводе. Длина форматной записи измеряется в литерах. Форматную запись можно прочитать или записать только при помощи инструкции форматного ввода- вывода. 10.2.2. Бесформатные записи Бесформатные записи используются в тех случаях, когда нужно запомнить данные на внешнем носителе для последующего чтения без редактирования. Бесформатные записи хранятся в некотором внутреннем зависящем от процессора представлении и могут содержать арифметические, логические и текстовые данные. Длина бесформатной записи измеряется в единицах, зависящих от процессора, таких, как биты, байты, слова, и определяется содержимым списка вывода. Бесформатная запись может быть прочитана или записана при помощи инструкции бесформатного ввода-вывода. 10.2.3. Запись конца файла Запись конца файла служит для обозначения логического конца файла данных. Запись этого типа выводится при помощи инструкции END FILE и не содержит данных. Если запись конца файла встречается в процессе выполнения инструкции READ, то возникает ситуация «конец файла». 10.3. ФАЙЛЫ файл — это последовательность логических записей, хранящихся на внешнем носителе. Способы чтения файла и записи в файл определяются свойствами внешнего носителя. В Фортране 77 различаются файлы двух видов — внешние и внутренние. Понятие внутреннего файла введено для того, чтобы задавать перемещение данных из одной области внутренней (оперативной)
118 10. Ввод и вывод. Основные понятия памяти в другую. В этой главе рассматриваются понятия, относящиеся к файлам. Записи в файле должны быть либо все формат* ные, либо все бесформатные, 10.3.1. Внешний файл Внешний файл — это множество записей, хранящихся на внешнем носителе, таком, как магнитная лента или диск. Файлом может быть колода перфокарт, терминальное устройство, с которого пользователь взаимодействует с процессором, или страница напечатанного текста. Фактически большинство периферийных устройств могут быть ассоциированы с файлом языка Фортран 77. Файл может быть пустым; это означает, что он не содержит ни одной записи. 10.3.2. Внутренний файл Внутренний файл — это область оперативной памяти, описанная как текстовая переменная, текстовый массив или подцепочка. В процессе выполнения операции чтения или записи с внутренним файлом всегда происходит редактирование. Таким образом, эту возможность можно использовать для преобразования данных из одного вида в другой. С исторической точки зре ния понятие внутреннего файла аналогично средствам READ ТАРЕ нуль в Фортране II и READ канал нуль в Фортране IV, которые имелись в некоторых реализациях языка Фортран 1). 10.3.3. Терминология, связанная с файлами При обсуждении файлов нам потребуется определить несколько терминов, хотя сами понятия достаточно широко известны. Поскольку файл определяется как последовательность записей, то между записями существует отношение следования, которое отражено в примере, посвященном терминологии о файлах, на рис. 10.1, а также в следующих определениях: Начальная точка — позиция в файле перед первой записью данных.^ Конечная точка — позиция в файле после самой последней записи данных. Текущая запись — это понятие, отражающее наличие в оперативной памяти только что прочитанной из файла записи. С точки зрения файла текущей записи не существует, так как записи прочитываются или записываются всегда целиком. Х) В некоторых реализациях Фортрана аналогичные возможности реализованы в виде инструкций ENCODE и DECODE.— Прим. перев.
10.4. Методы доступа 119 Предыдущая запись — запись, расположенная непосредственно перед текущей позицией в файле. Если текущая позиция файла находится в начальной точке, то предыдущей записи не су- щестьует. (Другое определение: только что прочитанная или записанная запись.) Следующая запись — запись или позиция записи, расположенная непосредственно после текущей позиции файла. Если текущая позиция находится в конечной точке файла, то следующей записи не существует. (Другое определение: запись, которая будет записана или прочитана следующей.) Начальная точка Конечная точка Начало файла И Запись конца файла Конец файла 1—Текущая позиция файла находится здесь. По отношению к текущей позиции файла: t С-предыдущая запись 2. D- следующая запись В памяти с Это текущая запись в памяти Рис. 10.1. Пример, иллюстрирующий терминологию. Файл может иметь также атрибуты, зависящие от процессора, такие, как имя файла, права доступа, параметры, описывающие положение файла на внешних носителях. 10.4. МЕТОДЫ ДОСТУПА Метод доступа определяет порядок, в котором записи можно писать в файл или читать из файла. Как уже упоминалось, метод доступа в большой степени зависит от специфики внешнего носителя, на котором расположен файл, и от способа организации записей внутри файла. 10.4.1. Атрибуты доступа Имеются два атрибута доступа, которые характеризуют файл: SEQUENTIAL (последовательный) и DIRECT (прямой). Конкретный файл может иметь либо один из этих атрибутов, либо оба в зависимости от процессора и от операционной среды. К файлу с атрибутом SEQUENTIAL может быть осуществлен последовательный доступ при помощи инструкций ввода-вывода последовательного доступа. К файлу с атрибутом DIRECT может быть осуществлен доступ при помощи инструкций ввода-
120 10. Ввод и вывод. Основные понятия вывода прямого доступа. В любом случае, однако, атрибуты доступа определяют метод адресации записей в файле, который допускает Фортран-система и который может не отражать реальный способ функционирования аппаратуры. Файлы с атрибутом SEQUENTIAL содержат записи конца файла, которые соответствуют ситуации конца файла, рассмотренной выше. В файлах, имеющих только атрибут DIRECT, нет записи конца файла. 10.4.2. Последовательный доступ Последовательный доступ — это метод записи и чтения файла, когда заранее известна последовательность, в которой будут происходить обращения к записям файла. Если производится последовательный доступ к файлу с атрибутом SEQUENTIAL, например к файлу на перфокартах или на магнитной ленте, то записи должны обрабатываться последовательно, отсюда название — последовательный доступ. Запоминающее устройство прямого доступа также может быть использовано для хранения файла с атрибутом SEQUENTIAL, доступ к которому происходит последовательно. В этом случае записи также читаются и пишутся последовательно при помощи инструкций последовательного ввода и вывода, а аппаратура и программное обеспечение нижнего уровня обеспечивают необходимую обработку этих инструкций. Если последовательный доступ осуществляется к файлу, обладающему также атрибутом DIRECT, то записи читаются и пишутся последовательно в соответствии со своими номерами. К внутренним файлам возможен только последовательный доступ. 10.4.3. Прямой доступ Прямой доступ — это метод записи и чтения файла, когда последовательность, в которой будет происходить обращение к записям файла, заранее неизвестна. Прямой доступ применяется по отношению к тем файлам, записи которых можно читать и писать в произвольном порядке; подразумеваемая упорядоченность записей определяется их номерами, а не тем порядком, в котором они были записаны в файл. Номер записи — это целое число, которое указывается в тот момент, когда запись выводится в файл прямого доступа. Все записи в файле с атрибутом DIRECT обязаны иметь одинаковую длину; вывод прямого доступа в свободном формате не допускается,
10.5. Каналы 10.4.4. Доступ к внутренним файлам Перед началом ввода или вывода текущая дозиция внутреннего файла всегда находится в его начальной точке. Если файл представляет собой одну текстовую цепочку, то он состоит из единственной записи. Если файл является массивом цепочек, то каждой элемент массива — это отдельная запись. В этом случае в спецификацию формата может входить наклонная черта, и тогда будет записано или прочитано несколько записей. 10.5. КАНАЛЫ В Фортране 77 обращение к .файлу данных осуществляется через канал. Для внешнего файла канал задается в виде целого значения, которое должно быть положительным или нулевым. Для внутреннего файла канал задается как текстовая переменная, текстовый массив, элемент текстового массива или текстовая подцепочка. 10.5.1. Подсоединение Установление связи между каналом и файлом называется подсоединением. Канал может быть подсоединен неявно процессором, или явно при помощи инструкции OPEN. Все каналы в Фортране 77 предварительно (т. е. перед началом выполнения программы) подсоединены. Инструкция OPEN служит для гого, чтобы указать или изменить управляющую информацию для канала, подсоединить канал, если он был отсоединен, или подсоединить канал к другому файлу вместо прежнего. В каждый момент времени к каналу может быть подсоединен только один файл. Но разрешается, отсоединив кацал от одного файла, подсоединить его к другому файлу. 10.5.2. Отсоединение Канал отсоединяется от файла данных в следующих случаях: 1. При выполнении инструкции CLOSE с этим каналом. 2. При выполнении инструкции OPEN с данным каналом, но с другим файлом данных. (Способ выполнения отсоединения в этом случае зависит от процессора.) 3. Завершение выполнения программы. В инструкциях ввода-вывода, кроме OPEN, CLOSE и INQUIRE, нельзя ссылаться на отсоединенные каналы.
122 ^ 10. Ввод и вывод. Основные понятия 10.6. СПИСОК УПРАВЛЯЮЩЕЙ ИНФОРМАЦИИ Список управляющей информации в инструкциях READ или WRITE может содержать следующую управляющую информацию о способе выполнения операции ввода или вывода: 1. Канал # 2. Формат 3. Номер записи 4. Код ответа 5. Возврат по ошибке 6. Возврат по концу файла Совокупность этих шести спецификаций называется «списком управляющей информации», сокращенно — уисп. 10.6.1. Синтаксис списка управляющей информации Список уисп может содержать следующие позиционные и ключевые параметры: [UNIT = ]« (канал) [FMT —]/ (формат) REC = /7z (номер записи) IOSTAT = ios (код ответа) ERR — s (возврат по ошибке) END = s (возврат по концу файла) Если спецификации канала и формата задаются как позиционные параметры, то они должны стоять в списке соответственно на первом и на втором месте. Ключевые параметры в списке могут располагаться в произвольном порядке. Примеры: READ(5,9000,END= 1000)A,B,C,D WRITE(99,8000,REC = ISEQ,ERR =- 1500)CARRAY READ(FMT = 9000,END = 1000,UNIT = 5)A,B,C, D Если спецификация формата присутствует, то выполняется операция форматного ввода или вывода, в противном случае выполняется операция бесформатного ввода или вывода. Если присутствует спецификация номера записи, то подразумевается операция ввода или вывода с прямым доступом, в противном случае имеется в виду операция ввода или вывода последовательного доступа.
10.6, Список управляющей информации 123 10.6.2. Спецификация канала Спецификация канала имеет вид [UNIT=] и где и может быть 1. Целым выражением, имеющим неотрицательное значение, которое идентифицирует внешний канал. 2. Звездочкой, обозначающей внешний системный канал, предварительно подсоединенный для последовательного ввода или вывода. 3. Идентификатор внутреннего файла, который представляет собой имя текстовой переменной, текстового массива, элемента текстового массива или текстовой подцепочки. Спецификация внешнего канала имеет одно и то же глобальное значение во всех программных компонентах данной исполняемой программы. 10.6.3. Спецификация формата Спецификация формата имеет вид [FMT=] / где / может быть 1. Меткой инструкции FORMAT в той же программной компоненте, где находится спецификация формата. 2. Целой переменной, которой при помощи инструкции ASSIGN было присвоено значение метки инструкции FORMAT из той же программной компоненты, где находится спецификация формата. 3. Именем текстового массива. 4. Текстовым выражением, не содержащим операций конкатенации, один из операндов которой является формальным параметром или переменной с длиной, описанной в виде звездочки в скобках. 5. Звездочкой, которая обозначает свободный формат. Если в спецификации формата ключевое слово FMT опущено, то оно должно быть опущено и в спецификации канала.
124 Ю. Ввод и вывод. Основные понятия 10.6.4. Спецификация номера записи i Спецификация номера записи имеет вид i REC=ra J где rn — целое выражение, которое в момент выполнения инструкции должно иметь положительное значение. Эта специфика- I ция служит для указания номера записи, которую нужно прочитать или записать в данной операции ввода-вывода. 10.6.5. Спецификация кода ответа Спецификация кода ответа имеет вид I IOSTAT = ios где ios — целая переменная или элемент массива целого типа. ] По окончании выполнения соответствующей инструкции ввода ] или вывода ios будет содержать одно из следующих значений: 1 1. Нуль, если операция завершилась успешно,-т. е. не было I ошибки и не встретилась запись конца файла. J 2. Целое положительное значение, зависящее от реализации, ] если во время выполнения операции произошла ошибка. I 3. Целое отрицательное значение, зависящее от реализации, I если при вводе встретилась запись конца файла и не было ошибок. 1 Соответствующее значение присвоится переменной ios незави- I симо от того, присутствует ли в списке управляющей информа- 1 ции также спецификация возврата по ошибке или по концу 1 файла. 1 10.6.6. Спецификация возврата по ошибке ] Спецификация возврата по ошибке имеет вид ERR=s где s — метка исполняемой инструкции в той же программной j компоненте, где находится спецификация. Если во время выпол- | нения инструкции ввода или вывода, содержащей спецификацию 1 возврата по ошибке, произойдет какая-либо ошибка, то управле- I ние будет передано инструкции, помеченной меткой s. Как указывалось выше, переменная, указанная в спецификации кода ответа, примет при этом соответствующее значение.
10.7. Список ввода-вывода 125 10.6.7. Спецификация возврата по концу файла Спецификация возврата по концу файла имеет вид END = s где s — метка исполняемой инструкции в той же программной компоненте, где находится спецификация. Если при выполнении инструкции READ, содержащей спецификацию возврата по концу файла, встретится запись конца файла и не произойдет какой- либо ошибки, то управление будет передано инструкции, помеченной меткой s, и выполнение операции чтения завершится. Как указывалось выше, переменная, заданная в спецификации кода ответа, примет соответствующее значение. 10.7. СПИСОК ВВОДА-ВЫВОДА В списке ввода-вывода инструкций READ, WRITE и PRINT перечисляются данные, участвующие в операции ввода или вывода. Список ввода-вывода — это либо простой список, либо простой список, заключенный в скобки, либо список неявного цикла, либо два списка ввода-вывода, разделенные запятой. Каждый из этих случаев разъясняется ниже. 10.7.1. Простой список Простой список — это последовательность спецификаций данных, разделенных запятыми. Список вывода несколько отличается от списка ввода, так как он может содержать выражения, а список ввода нет. 107.1.1. Список ввода В простой список ввода могут входить 1. Переменные 2. Массивы 3. Текстовые подцепочки 4. Элементы массива Примеры: READ(5,9000,END = 5000)A,6(I,J + 1),C(4:6) READ(KFILE,REC^IREC,ERR = 6000)N,RLIST(N,3), CTABLE
126 10. Ввод и вывод. Основные понятия 10.7.1.2. Список вывода В простой список вывода могут входить 1. Переменные 2. Массивы 3. Текстовые подцепочки 4. Элементы массивов 5. Выражения, за исключением текстовых выражений, содержащих операцию конкатенации, один из операндов которой является формальным параметром или переменной с длиной, заданной в виде звездочки в скобках Примеры: WRITE(6,8000,ERR = 50)<PAGE NO',N,SQRT(R) + 1.23, A(I,J/K + 1) WR ITE(LTR,REC= KREC,ERR =* 7000)CLIST,M, RTABLE(M/2—1) 10.7.2. Неявный цикл Неявный цикл имеет вид (дсписок, i = eu e2 [,£з1) где дсписок — список ввода-вывода, г — управляющая переменная, ей е2у е3 — управляющие параметры. Значения, которые пробегает i и условия, налагаемые на i, eu е2у еЪу в точности такие же, как для инструкции DO. Правила выполнения цикла DO справедливы и для неявного цикла. Управляющая переменная / не должна входить в качестве члена в список ввода или вывода дсписок, но дсписок может включать другие неявные циклы х). При вводе выражения еи е2, е3 не должны содержать переменные, встречающиеся в дспискеу но могут содержать переменные, встречающиеся в списке ввода перед данным неявным циклом. Примеры: READ(3,9500,END = 2000)N,M,((A(I,J),J = 1,M),I = 1,N) WRITE(17,REC=KREC,ERR = 3000)(B(K+1),K- LIM/2 + l,I),TOP Если в списке ввода-вывода встретился неявный цикл, то это равносильно присутствию в списке всех элементов дсписка для х> Управляющая переменная i может встречаться в дсписке в индексных выражениях.
10.81 Операции передачи данных 127 каждого повторения неявного цикла, где управляющая переменная i пробегает все значения, определяемые управляющими параметрами цикла. 10.7.3. Массивы Если в списке ввода-вывода встретилось имя массива, то это равносильно присутствию в списке всех элементов массива, выписанных по столбцам. Например, инструкции REAL A(2,3) READ(*,100)A эквивалентны инструкциям REAL A(2,3) READ(*,100)A(1,1)A(2,1),A(1,2),A(2,2),A(1,3),A(2,3) 10.8. ОПЕРАЦИИ ПЕРЕДАЧИ ДАННЫХ Во время выполнения операций ввода и вывода происходит пересылка данных между записями данных и элементами списка ввода-вывода. Переход к следующему элементу списка происходит лишь после завершения обработки предыдущего элемента, порядок обработки соответствует порядку расположения элементов в списке. Таким образом, элемент списка ввода может использоваться в определениях последующих элементов списка, например * READ(KFILE)N,(A(I),I = 1,N) или READ(IFILE,5000)N,(A(I),I=1,N) Имеются три ограничения: 1. Элемент списка ввода не должен совпадать с текстовой цепочкой, описывающей формат в той же инструкции ввода. 2. Все элементы списка вывода к началу выполнения инструкции вывода должны быть определены. 3. При вводе из внутреннего файла элемент списка ввода не должен пересекаться с областью памяти, занимаемой внутренним файлом. В последующих разделах описываются способы выполнения форматной и бесформатной передачи данных.
128 10. Ввод и вывод. Основные понятия 10.8.1. Операции бесформатной передачи данных При выполнении инструкций бесформатного взрда или вывода всегда читается или записывается одна запись. При бесформатном вводе запись должна содержать значений не меньше, чем указано в списке ввода, а типы значений должны быть согласованы с типдми элементов списка ввода. Текстовые значения в вводимой записи должны иметь те же длины, что и соответствующие им элементы списка ввода. Лишние значения в записи игнорируются, если же в записи не хватает значений, то имеет место ошибка. Выполнение инструкций бесформатного вывода подчиняется следующим соглашениям: 1. Если доступ последовательный, то длина записи определяется списком вывода. 2. Если доступ прямой, то список вывода не должен содержать значений больше, чем, может поместиться в выводимую запись, Если выврдимая запись заполнена не до конца, то она остается частично определенной. Инструкции бесформатного ввода и вывода могут применяться только к внешним файлам. 10.8.2. Операции форматной передачи данных При выполнении операций форматного ввода или вывода данные соответственно перед занесением в память или в выводимую запись подвергаются редактированию под управлением спецификации формата. При выполнении инструкции ввода перед началом редактирования запись прочитывается из файла. Таким образом, при каждом выполнении инструкции READ прочитывается по крайней мере одна запись. Количество данных, выбираемых из записи, определяется списком ввода. Расположение я внешний вид этих данных определяются соответствующей инструкцией FORMAT. Запись должна содержать достаточное количество данных; лищнйе данные игнорируются. Спецификация формата может вызвать чтение последующих записей. Если доступ прямой, то при каждом чтении номер записи увеличивается на единицу. При каждом выполнении инструкции WRITE выводится до крайней мере одна запись по указанному каналу. Объем выводимых данных определяется как списком вывода, так и спецификацией формата. Каждое выводимое значение выбирается из памяти, преобразуется во внешнее представление под управлением очередной спецификации преобразования и помещается в вывод ную запись. После того как обработан последний элемент списка- вывода, формирование выводной записи завершается независимо от того, остались ли в спецификации формата неиспользованные
Ю.8. Операции передачи данных 129 спецификации преобразования. Сформированная запись выводится или помещается в память по указанному каналу. В соответствии со спецификацией формата может быть выведено несколько записей. Если при выводе в файл прямого доступа текст, сформированный из элементов списка вывода под управлением указанного формата, не заполняет всю запись, то она дополняется пробелами. В случае прямого доступа длина сформированного текста не должна превышать размер записи. Если при выводе в файл прямого доступа под управлением спецификации формата выводится несколько записей, то перед выводом каждой последующей записи номер записи увеличивается на единицу. 10.8.3. Файл печати При выводе в файл печати первая литера каждой выводной записи управляет расположением строк. Эта литера называется «литерой управления кареткой». Остальные литеры в записи печатаются, начиная от левого края страницы. Относительно литеры управления кареткой устанавливаются следующие соглашения: Литера На сколько строк вниз продвигается каретка перед печатью данной строки Пробел Одна строка 0 (нуль) Две строки 1 До первой строки следующей страницы + Каретка не продвигается (печать поверх предыдущей строки) Записи, не содержащие ни одной литеры, которые могут получаться, если в спецификации формата встречается наклонная черта, означают печать пустой строки (т. е. происходит продвижение каретки на одну строку вниз и печать пустой строки). 10.8.4. Ввод и вывод в свободном формате Если в инструкции ввода или вывода спецификация формата задана в виде звездочки, то ввод или вывод будет производиться в свободном формате. При выполнении операций ввода-вывода в свободном формате редактирование данных происходит без участия спецификации формата. Элементы данных в записи разделяются запятыми или пробелами, это зависит от конкретной реализации языка Фортран 77. Более подробно данная тема рассматривается ниже в разделах, посвященных спецификациям форматов. Г. Катцав
130 10. Ввод и вывод. Основные понятия 10.8.5. Установка текущей позиции в файле Если при вводе встретилась запись конца файла, а также после выполнения инструкции ENDFILE, текущая позиция в файле последовательного доступа находится после записи конца файла. В этом случае дальнейшие операции по передаче данных с этим файлом выполнять нельзя, не переустановив предварительно текущую позицию в файле. Сделать это можно при помощи инструкций REWIND и BACKSPACE.
11 ИНСТРУКЦИИ ВВОДА И ВЫВОДА 11.1. ОБЩАЯ ХАРАКТЕРИСТИКА ИНСТРУКЦИЙ ВВОДА И ВЫВОДА Инструкции ввода и вывода в Фортране 77 делятся на три группы: инструкции передачи данных, вспомогательные инструкции и инструкции установки позиции в файле. К инструкциям передачи данных относятся инструкции READ, WRITE и PRINT. В группу вспомогательных инструкций входят инструкции OPEN, CLOSE и INQUIRE. Инструкции BACKSPACE, END FILE и REWIND составляют группу инструкций установки позиции в файле. Для полного понимания данной главы необходимо подробное ознакомление с общими понятиями о вводе и выводе, рассмотренными в предыдущей главе. 11.2. ИНСТРУКЦИИ ПЕРЕДАЧИ ДАННЫХ Инструкции передачи данных служат для пересылки информации из оперативной памяти во внешнюю или наоборот, а также из одной области оперативной памяти в другую. Для описания операции ввода имеются две формы инструкции READ; инструк-, ции WRITE и PRINT задают операции вывода. 11.2.1. Инструкция READ Инструкция READ имеет вид READ (yucn) [ввсп] где уисп — список управляющей информации, ввсп — список ввода-вывода; оба этих списка рассматривались выше. Эта форма инструкции READ может использоваться как для форматного, так и для бесформатного ввода из файла, указанного в уисп. Другая возможная форма инструкции READ: READ / [, ввсп] где / — идентификатор формата, ввсп — список ввода, который может отсутствовать. Эта форма инструкции READ служит для форматного ввода с системного вводного устройства. 5*
132 //. Инструкции ввода и вывода Примеры: READ(2,1500,END = 5000)A,B,C,D READ(12fREC = LRTfERR = 8000)(CAB(IfJ)fJ = l,N) READ 50,X,Y,Z,W П.2.2. Инструкция WRITE Инструкция WRITE имеет вид WRITE (уисп) [ввсп] где уисп — список управляющей информации, а ввсп — список вывода, который может отсутствовать; списки обоих видов рассматривались выше. Инструкция WRITE может служить как для форматного, так и для бесформатного вывода в файл, указанный в уисп. Примеры: WRITE(*,8500)A,B,NLOC,(TOM(I),I - l,NLOC) WRITE(1)BIGLST 11.2.3. Инструкция PRINT Инструкция PRINT имеет вид PRINT / [,восп] где / — идентификатор формата, а ввсп — список вывода, возможно отсутствующий. Инструкцию PRINT можно использовать для форматного вывода на системное выводное устройство. Примеры: PRINT 10f(LIST(K),K=l,N + l) PRINT*,P1,P2,P3 PRINT*,«AREA IS',A/LENGTH IS\L 11.3. ВСПОМОГАТЕЛЬНЫЕ ИНСТРУКЦИИ Вспомогательные инструкции используются для явного открытия и закрытия файлов, а также для получения справочной информации о файле или канале. 11.3.1. Инструкция OPEN Инструкция OPEN служит для подсоединения файла к каналу и имеет вид OPEN (осписок)
11.3. Вспомогательные инструкции 133 где осписок — список, в который могут входить следующие спецификации: [UNIT = ] и (канал) IOSTAT = ios (код ответа) ERR = s (возврат по ошибке) FILE=/m (файл) STATUS = sta (диспозиция) \ ACCESS = асе (доступ) FORM = fm (форматность) RECL = r/ (длина записи) BLANK = blnk (пробел) Спецификация UNIT обязательна, она указывает номер внешнего канала. Остальные спецификации необязательны, и ни одна из них не должна появляться в данной инструкции OPEN более одного раза. Ниже приводится описание каждой из этих спецификаций. Спецификация кода ответа (IOSTAT) указывает переменную или элемент массива, которым в результате выполнения инструкции OPEN будет присвоено некоторое значение. Нулевое значение означает, что подсоединение файла выполнилось без ошибок. Положительное значение, зависящее от реализации, означает, что произошла ошибка. Пример: IOSTAT = IOVAL В спецификации возврата по ошибке (ERR) указывается метка инструкции, которой нужно передать управление, если при выполнении инструкции OPEN произойдет ошибка. Пример: ERR =5000 Спецификация файла (FILE) — это текстовое выражение, задающее имя файла, который нужно подсоединить. Имя должно иметь такой вид, который распознается данным процессором. Пример: FILE = 'AFILE' Спецификация диспозиции файла (STATUS) задает текстовое выражение, которое после удаления пробелов должно приводиться к одному из значений: OLD (старый) NEW (новый) SCRATCH (временный) UNKNOWN (неизвестный)
134 //. Инструкции ввода и вывода Значения OLD, NEW, SCRATCH соответствующим образом специфицируют подсоединяемый файл. Смысл значения UNKNOWN зависит от конкретной реализации. Пример: STATUS-'NEW* В спецификации доступа (ACCESS) указывается текстовое выражение, которое после удаления пробелов должно приводиться к одному из значений: DIRECT (прямой) SEQUENTIAL (последовательный) По умолчанию берется значение SEQUENTIAL. Пример: ACCESS-'DIRECT В спецификации форматности (FORM) указывается текстовое выражение, которое после удаления пробелов должно приводиться к одному из значений: FORMATTE D (форматный) UNFORMATTED (бесформатный) По умолчанию для файлов последовательного доступа берется значение FORMATTED, для файлов прямого доступа — UNFORMATTED. Пример: FORM='UNFORMATTED' В спецификации длины записи (RECL) указывается целое выражение, которое должно иметь положительное значение, обозначающее длину записи в байтах для форматного файла и в единицах, зависящих от процессора, для бесформатного файла. Эта спецификация нужна только для файлов прямого доступа; для файлов последовательного доступа она игнорируется. Пример: RECL = LENREC В спецификации пробела (BLANK) указывается текстовое выражение, которое после удаления пробелов должно приводиться к одному из значений: NULL (пусто) ZERO (нуль) По умолчанию берется значение NULL. Спецификация NULL означает, что при вводе числовых значений пробелы нужно игнорировать. Спецификация ZERO означает, что при вводе числовых значений все пробелы, кроме начальных, нужно воспринимать как нули. Пример: BLANK='ZERO'
11.3. Вспомогательные инструкции 135 Можно выполнять инструкцию OPEN с каналом, к которому уже подсоединен файл. Если подсоединяется другой файл, то старый файл предварительно закрывается (отсоединяется), а уже затем подсоединяется новый. Если подсоединяется тот же самый файл, то все спецификации, за исключением BLANK, должны совпадать с указанными ранее. 11.3.2. Инструкция CLOSE Инструкция CLOSE служит для отсоединения файла от канала и имеет вид CLOSE (зсписок) где список зсписок может содержать следующие параметры: [UNIT = ] и (канал) IOSTAT = ios (диспозиция) ERR = s (возврат по ошибке) STATUS = sta (код ответа) Спецификация UNIT обязательна, она указывает номер канала. Остальные спецификации необязательны; ни одна из спецификаций не должна входить в инструкцию CLOSE более одного раза. Ниже приводится описание спецификаций зсписка. В спецификации кода ответа (IOSTAT) указывается целая переменная или элемент массива, которым в результате выполнения инструкции CLOSE будет присвоено некоторое значение. Если присвоено нулевое значение, то ошибок не было. Если значение положительное, то произошла ошибка. Пример: IOSTAT = К В спецификации возврата по ошибке (ERR) указывается метка инструкции, которой следует передать управление, если при выполнении инструкции CLOSE произойдет ошибка. Пример: ERR =6000 В спецификации диспозиции (STATUS) указывается текстовое выражение, которое после удаления пробелов должно приводиться к одному из значений: KEEP (сохранить) DELETE (уничтожить) Спецификации KEEP и DELETE указывают соответствующие диспозиции файла. Если файл был открыт как SCRATCH (временный), то в инструкции CLOSE нельзя указывать диспозицию
136 //. Инструкции ввода и вывода KEEP. По умолчанию для SCRATCH-файлов берется значение DELETE, а для остальных — KEEP. Пример: STATUS='DELETE' Инструкция CLOSE не обязательно должна находиться в той же программной компоненте, в которой файл был открыт. И.8.8. Инструкция INQUIRE Инструкция INQUIRE служит для получения информации о свойствах и текущем состоянии файла и имеет вид INQUIRE (исписок) Здесь исписок — это список спецификаций для инструкции INQUIRE. Допускаются два вида инструкции INQUIRE — информация о файле и информация о канале. Для получения информации о файле нужно указать имя файла, а спецификация канала должна отсутствовать. Для получения информации о канале задается номер канала, а имя файла не указывается. Каждая из следующих спецификаций может входить в инструкцию INQUIRE не более одного раза: IOSTAT = /os (код ответа) ERR==s (возврат по ошибке) ЕХ 1ST = ех (существует) OPENED = od (открыт) NUMBER = пит (номер) NAMED = птй (поименован) NAME- fn (имя) ACCESS = асе (доступ) SEQUENTIAL = seq (последовательный) DIRECT = dt> (прямой?) FORM = fm (форматность) FORMATTED = fmt (форматный?) UNFORMATTED = unf (бесформатный?) RECL = rcl (длина записи) NEXTREC = nr (следующая запись) BLANK = blnk (пробел) Эти спецификации объясняются в табл. 11.1.
11 А. Инструкции установки текущей позиции в файле 137 11.4. ИНСТРУКЦИИ УСТАНОВКИ ТЕКУЩЕЙ ПОЗИЦИИ В ФАЙЛЕ Инструкции установки позиции определены только для файлов последовательного доступа. Все инструкции этой группы имеют следующие параметры: 1. и— идентификатор (номер) внешнего канала ввода-вч вода. 2. асписок — это список, в который смогут входить спецификации: [UNIT = ] и (канал) IOSTAT = ios (код ответа) ERR=s (возврат по ошибке) Смысл этих спецификаций разъяснялся выше в данной главе. Спецификация канала (UNIT) должна присутствовать обязательно, остальные спецификации — не более одного раза в данной инструкции установки позиции. Инструкции установки позиции в файле применяются только к внешним файлам. 11.4.1. Инструкция BACKSPACE Инструкция BACKSPACE служит для продвижения позиции в файле на одну запись назад и может иметь одну из форм: BACKSPACE и BACKSPACE (асписок) Если предыдущей записи нет (позиция в файле установлена на начало), то позиция файла не изменится. Если предыдущей записью была запись конца файла, то после выполнения инструкции BACKSPACE позиция файла установится перед записью конца файла. Инструкцию BACKSPACE нельзя применять к файлам, которые были сформированы путем вывода в свободном формате. Примеры: BACKSPACE N BACKSPACE (UNIT = 6,IOSTAT = KZ,ERR - 5000) 11.4.2. Инструкция ENDF1LE Инструкция ENDFILE служит для вывода записи конца файла и может иметь одну из форм: ENDFILE и ENDFILE (асписок)
Таблица спецификаций для инструкции INQUIRE Таблица 11.1 Спецификация FILE = /m (файл) UNIT = и (канал) IOSTAT = ws (код ответа) ERR=s (ошибка) EXIST = ex (существует?) OPENED = od (открыт?) NUMBER =num (номер канала) NAMED =nmd (поименован?) Тип данных Текстовое выражение Целое выражение, имеющее положительное значение Переменная или элемент массива целого типа Метка инструкции Переменная или элемент массива логического типа Переменная или элемент массива логического типа Переменная или элемент массива целого типа Переменная или элемент массива целого типа Значение Имя файла для получения информации о файле Номер канала для получения информации о канале ios = 0, если ошибки нет; ios > 0, если произошла ошибка В случае ошибки, относящейся к указанному файлу или каналу, управление будет передано по метке s е*—.TRUE., если файл с указанным именем существует, иначе ех= . FALSE. orf=.TRUE., если указанный файл или канал подсоединен, иначе od=. FALSE. пит—номер канала, к которому подсоединен внешний файл с указанным именем; если файл не подсоединен, то значение пит не определено nmd= .TRUE., если файл, который подсоединен к указанному каналу, имеет имя, иначе nmd= .FALSE.
Продолжение табл. П.! Спецификация NAME = fn (имя) ACCESS = асе (доступ) SEQUENTIAL = seq (последовательный?) DIRECT = di> (прямой?) FORM = /m (форматность) FORMATTED =fmt (форматный?) Тип данных Переменная или элемент массива текстового типа Переменная или элемент массива текстового типа Переменная или элемент массива текстового типа Переменная или элемент массива текстового типа Переменная или элемент массива текстового типа Переменная или элемент массива текстового типа Значение fn—имя внешнего файла, подсоединенного к указанному каналу. Если файл не имеет имени или не подсоединен, то значение fn не определено асе примет одно из значений 'SEQUENTIAL' или 'DIRECT', если файл или канал подсоединен соответственно для последовательного или прямого доступа. Если файл не подсоединен, то значение асе не определено seq примет значение YES, если указанный файл или канал подсоединен для последовательного доступа, NO, если не подсоединен или доступ не последовательный, UNKNOWN, если процессор не в состоянии определить тип доступа dir примет значение YES, если указанный файл или канал подсоединен для прямого доступа, NO, если не подсоединен или доступ не прямой, UNKNOWN, если процессор не в состоянии определить тип доступа fm примет значение FORMATTED или UNFORMATTED, если канал или файл подсоединен и способ передачи данных соответственно форматный или бесформатный. Значение fm не определено, если файл не определен fmt примет значение YES, если канал или файл подсоединен и способ передачи данных форматный, N0, если не подсоединен или бесформатный, UNKNOWN, если процессор не может определить способ передачи данных
Продолжение табл. ПА Спецификация UNFORMATTED=*m/ (бесформатный?) RECL = rrt (длина записи) NEXTREC = nr (следующая запись) BLANK - blnk (пробел) Тип данных Переменная или элемент массива текстового типа Переменная или элемент массива целого типа Переменная или элемент массива целого типа Переменная или элемент массива текстового типа Значение ttnf примет значение YES, если канал или файл подсоединен и файл бесформатный, N0, если не подсоединен или файл форматный, UNKNOWN, если процессор не может определить способ передачи данных Если тип доступа канала или файла прямой, то rcl будет содержать длину записи в литерах для форматного файла и в единицах, зависящих от процессора, для бесформатного файла. Если файл не подсоединен или доступ не прямой, то значение rcl не определено Если канал или файл подсоединен для прямого доступа, то пг будет содержать номер записи, которая будет прочитана или записана следующей. Если ни одна запись не была прочитана или записана, то пг=\. Если файл не подсоединен или доступ не прямой или состояние файла не определено, то значение пг не определено blnk примет значение ZERO или NULL в зависимости от того, с каким признаком был подсоединен файл. Если файл не подсоединен или способ передачи данных не форматный, то значение blnk не определено
НА. Инструкции установки текущей позиции в файле 141 После вывода записи конца файла позиция файла устанавливается вслед за записью конца файла. Запись конца файла может быть выведена и в файл, в который не было записано ни одной записи данных, важно только, чтобы файл был подсоединен к каналу. Примеры: ENDFILE KFILE ENDFILE(12,ERR = 8200) 11.4.3. Инструкция REWIND Инструкция REWIND служит для установки позиции файла в начало файла и может иметь одну из форм: REWIND и REWIND (асписок) Если позиция файла уже установлена в начало, то она не меняется. Пример: REWIND 10 REWIND(NFILE,IOSTAT = NVAL) Инструкции BACKSPACE, ENDFILE и REWIND можно применять как к форматным, так и к бесформатным файлам.
12 СПЕЦИФИКАЦИЯ ФОРМАТА 12.1. ОБЗОР Спецификация формата используется в инструкциях форматного ввода и вывода для управления процессом редактирования данных со стороны программы. Из спецификации формата процессор получает информацию о структуре форматной записи. При вводе дескрипторы преобразования раскрывают структуру различных полей данных во вводимой записи; при этом устанавливается соответствие между полем данных и элементом списка ввода. При выводе дескриптор преобразования указывает, какое текстовое представление должен принять тот или иной элемент данных на внешнем носителе; при этом устанавливается соответствие между элементом списка вывода и полем данных в выводимой записи. Спецификация формата является явным средством управления процессом редактирования при форматном вводе или выводе. Если в качестве спецификации формата использована звездочка, то подразумевается ввод или вывод в свободном формате. Этот случай рассматривается в специальном разделе данной главы. 12.2. СПОСОБЫ ЗАДАНИЯ СПЕЦИФИКАЦИИ ФОРМАТА Спецификацию формата можно задать либо при помощи инструкции FORMAT, либо в виде текстового объекта, значением которого должна быть цепочка литер, имеющая структуру спецификации формата. 12.2.1. Инструкция FORMAT Инструкция FORMAT служит для описания формата и имеет вид FORMAT сф где ^ — спевдфикация формата, которая описывается ниже. Инструкция hORMAT должна иметь метку, при помощи которой можно оыло бы сослаться на данную спецификацию формата в инструкции ввода или вывода. Инструкция FORMAT — единет-
12.2. Способы задания спецификации формата 143 венная инструкция языка Фортран 77, в которой метка обязательна. Пример: 9000 FORMAT(10X,I5,3F12.6/(1X,I2,10I4)) Инструкция FORMAT — неисполняемая инструкция. 12.2.2. Задание формата в виде текстового объекта В качестве одного из способов задания формата в инструкции ввода или вывода допускается указание имени текстового массива, текстовой переменной, элемента текстового массива или текстового выражения. Последовательность литер, составляющих текстовый объект, должна иметь вид спецификации формата. Таким образом, спецификация формата может быть прочитана во время выполнения программы или вычислена как текстовое выражение. Текстовая величина, содержащая спецификацию формата, должна начинаться с открывающей скобки и заканчиваться закрывающей скобкой. Она должна располагаться в последовательных текстовых единицах памяти, в которых содержатся дескрипторы преобразования, разделители и управляющие дескрипторы редактирования. 12.2.3. Структура спецификации формата Спецификация формата имеет вид ({qitiZit2z2 . . . tnznq2X) где 1) q( — одна или более наклонных черт, двоеточие или пусто; 2) t{ — дескриптор преобразования, управляющий дескриптор редактирования или список дескрипторов преобразования и управляющих дескрипторов; 3) zt — либо разделитель (запятая, наклонная черта, двоеточие, последовательность наклонных черт), либо пусто, если список состоит из одного элемента. Дескрипторы преобразования и управляющие дескрипторы^ редактирования приведены в табл. 12.1. 12.2.4. Редактирование Редактирование осуществляется путем взаимодействия между элементом списка ввода-вывода и дескриптором преобразования. Если в списке ввода-вывода есть хотя бы один элемент, то в спецификации формата должен быть хотя бы один дескриптор преобразования. Пустая спецификация формата допускается лишь
144 12. Спецификация формата Таблица 12.1 Дескрипторы преобразования и управляющие дескрипторы редактирования Дескриптор Значение в языке Фортран 77 a\w alw.m paFw.d paFw.d paEw.dEe paDw.d paGw.d paGw. dEe aLw ak a Aw 'hxha ... h< ojHhxhs • • • 1c TLs TRs wX I SP ss BN BZ (...) Дескриптор преобразования для данных целого типа Дескриптор преобразования для данных целого типа Дескриптор преобразования для вещественных данных Дескриптор преобразования для вещественных данных Дескриптор преобразования для вещественных данных Дескриптор преобразования для данных двойной точности Дескриптор преобразования для вещественных и целых данных Дескриптор преобразования для вещественных и целых данных • Дескриптор преобразования для логических данных Дескриптор преобразования для текстовых данных Дескриптор преобразования для текстовых данных Дескриптор для вывода текстовых данных Дескриптор для вывода холлеритовских данных Перемещение указателя текущей позиции во внешней записи данных в позицию номер с Перемещение указателя текущей позиции в записи на s позиций влево Перемещение указателя текущей позиции в записи на s позиций вправо При вводе означает пропуск поля размера w, а при выводе —заполнение поля размера w пробелами Означает, что нужно прочитать следующую запись или вывести текущую запись Означает завершение операции вывода, если в списке вывода не осталось элементов Означает возврат к стандартному режиму вывода знака «плюс» Переход к режиму обязательного вывода знака «плюс» Переход к режиму, когда знак «плюс» не выводится Обозначает масштабирующий множитель Режим игнорирования пробелов при вводе числовых данных Режим, в котором при вводе числовых данных пробелы считаются нулями Групповой дескриптор где а —коэффициент повторения, который может отсутствовать. Если а опущен, то дескриптор преобразования или групповой дескриптор используется один раз ш —ненулевая целая константа без знака, обозначает размер поля данных т — целая константа без знака, указывающая число цифр при выводе целого числа
12.3. Дескрипторы преобразования 145 d—целая константа без знака, обозначает число цифр справа от десятичной точки F е— ненулевая целая константа без знака, обозначает число цифр в порядке числа р—масштабирующий множитель вида £Р, который может отсутствовать k—целая константа, возможно со знаком с—ненулевая целая константа без знака, обозначающая номер позиции в записи s — целая константа без знака, обозначающая смещение в записи ... — групповой дескриптор. Дескрипторы преобразования, управляющие дескрипторы редактирования и другие групповые дескрипторы заключаются в скобки тогда, когда список ввода-вывода также пуст. В этом случае при вводе пропускается одна запись, а при выводе выводится запись, не содержащая ни одной литеры. Интерпретация спецификации формата и редактирование вводимых и выводимых записей производятся слева направо, если нет явных указаний об изменении этого порядка. Коэффициент повторения означает многократное повторение следующего за ним дескриптора преобразования. Если спецификация формата использована до конца, а в списке ввода-вывода еще остались элементы, то происходит возврат к последней открывающей скобке 1} в формате. В этом случае читается следующая запись или выводится текущая запись и начинается формирование новой записи. (Если доступ прямой, то номер записи при этом увеличивается на единицу.) Область памяти для выводимой записи перед началом редактирования всегда заполняется пробелами. 12.3. ДЕСКРИПТОРЫ ПРЕОБРАЗОВАНИЯ И УПРАВЛЯЮЩИЕ ДЕСКРИПТОРЫ РЕДАКТИРОВАНИЯ В этом разделе рассматриваются дескрипторы преобразования и управляющие дескрипторы редактирования, которые приведены в табл. 12.1. Для полного понимания данного раздела необходимо иметь хотя бы элементарное представление о языке Фортран в целом. 12.3.1. Редактирование числовых данных Дескрипторы преобразования I, F, E, D и G служат для редактирования числовых данных. Во всех случаях, где не оговорено противное, выполняются следующие правила, если они не J> К последней открывающей скобке первого уровня.— Прим. перев. 6 Г. Катцан
146 12. Спецификация формата отменены явно при помощи соответствующих управляющих дескрипторов редактирования: 1. При вводе начальные пробелы поля не существенны. При выводе старшие нули не выводятся. Знак «плюс» не выводится, но минус, если он нужен, выводится. 2. При вводе с дескрипторами F, E, D и G, если в числе встретилась десятичная точка, то значение d игнорируется. 3. При выводе числа прижимаются к правому краю поля вывода. Если размер поля недостаточен для числа, то все поле заполняется звездочками. Числовые дескрипторы преобразования должны быть отделены друг от друга разделителями, которыми могут служить запятая (,), наклонная черта (/) или двоеточие ( :). 12.3.1.1. Дескриптор I Дескриптор I служит для преобразования данных целого типа из внутренней формы во внешнее десятичное представление и наоборот. Дескриптор I имеет вид \w где w — размер поля во внешней записи, включая пробелы и знак. При выводе знак печатается только тогда, когда число отрицательное. При вводе число не должно содержать десятичной точки. Пример: при вводе внешних значений W12, И62Ш и —#2100 с участием спецификаций 14, 15 и 16 соответственно в память будут занесены числа 12, 6210 и —2100. При выводе чисел —987 и 123 с участием спецификаций 15 и 14 соответственно сформируются поля Й—987 и 0123 При вводе числовых данных начальные пробелы всегда игнорируются, а пробелы внутри числа считаются нулями. Поле, целиком состоящее из пробелов, соответствует числу нуль. При выводе выводимое значение прижимается к правому краю поля. Если нужно, перед значением выводятся несколько пробелов. Допускается вариант дескриптора I вида Iw.m x При вводе дескриптор Iw.m интерпретируется так же, как lw. При выводе дескриптор Iw.m действует так же, как 1до, с той разницей, что выводится не менее т цифр — при этом могут появиться незначащие нули в начале числа. Если выводимое значение равно нулю и т равно нулю, то поле вывода будет состоять целиком из пробелов.
12,3. Дескрипторы преобразования 147 12.3.1.2. Дескриптор F Дескриптор F используется при преобразовании вещественных данных из внутренней формы во внешнее десятичное представление без порядка и наоборот. Дескриптор F имеет вид Fw.d где w — размер поля, включая пробелы, знак числа и десятичную точку, ad — число цифр в дробной части числа. При вводе числа десятичная точка в нем не обязательна, правые d цифр числа воспринимаются как дробная часть. Если же во вводимом числе десятичная точка присутствует, то значение d игнорируется. При выводе точка обязательно присутствует в числе, справа от нее располагается d десятичных цифр. Так, в результате ввода полей (где через Й обозначены пробелы) Ш—123 №—1.23 tf—1.230 —1.23Й с дескриптором F6.2 в память машины попадет одно и то же число —. 123 x10х. При выводе, например, значений .98134x10^ и —.63472 х Ю1 с дескрипторами соответственно F7.2 и F8.3 будут сформированы поля №98.13 и №—6.347 При вводе с дескриптором F внешнее представление числа может содержать десятичный порядок в одной из следующих форм: 1. Целая константа со знаком. Так, примером правильного числового поля будет .523—4, что означает .523x10"*. 2. Буква Е, за которой следует нуль или более пробелов и целая константа, возможно со знаком. Пример правильного числового поля: .523Е—4, что означает .523 х 10~4. 3. Буква D, за которой следуют возможные пробелы и целая константа с возможным знаком. Пример' правильного числового поля: .523D—4, что означает .523 X 10~4. Вводимое значение может иметь большую точность, чем допускает процессор. 12.3.1.3. Дескриптор Е Дескриптор Е предназначен для работы с вещественными данными, внешнее представление которых содержит десятичный порядок. Дескриптор Е имеет вид Ew.d 6*
148 12. Спецификация формата где w — размер поля, ad — количество десятичных цифр в числе. При вводе, если встретилась десятичная точка, значение d игнорируется, так же как и для дескриптора F. Порядок вещественного числа имеет вид Е±еее\ старшие нули порядка могут отсутствовать, так же как и знак, если число неотрицательное. Если порядок имеет знак, то буква Е может быть опущена. Размер поля w должен включать место для порядка. Порядок должен быть прижат к правому краю поля, поскольку пробелы воспринимаются как нули. При вводе числовых полей 3.14159Е0 314.159Е— 2 314159Е0 .314159Е + 1 с дескриптором Е 12.5 в память машины попадет одно и то же значение .314159Х101. При выводе с дескриптором Е число принимает следующий десятичный вид: ±0.(1^2... dnE±eee d w " где вместо знака плюс выводится пробел. Так, в результате выполнения инструкций А = 987.123 WRITE(6,9000)A 9000 F0RMAT(1H,E15.7) будет напечатано W*0.9871230EW)3 где через \Ь обозначены пробелы. При вводе, как и для формата F, порядок числа может отсутствовать; вводимое значение может иметь большую точность, чем допускает процессор. Имеется вариант дескриптора Е вида Ew.dEe При вводе редактирование для этого дескриптора выполняется так же, как и для Ew.d. При выводе редактирование производится так же, как для Ew.d, но порядок будет содержать е цифр.
12.3. Дескрипторы преобразования 149 12.3.1 .4. Дескриптор D Дескриптор D служит для редактирования данных двойной точности. Дескриптор D имеет вид Dw.d и интерпретируется точно так же, как дескриптор Е, но в обозначении порядка числа вместо буквы Е используется буква D. 12.3.1.5. Редактирование комплексных данных Элемент данных комплексного типа состоит из двух компонент вещественного типа и редактируется при помощи двух последовательных дескрипторов для вещественных значений. Например, в результате выполнения инструкций COMPLEX ARC ARC = (4.0,3.0) WRITE(6,9001)ARC 9001 F0RMAT(1H,2F5.1) будут напечатаны значения Ш.0ДО3.0 Аналогичным образом производится ввод комплексных чисел. 12.3.1.6. Дескриптор G Обобщенный (G, general) дескриптор G предназначен для редактирования вещественных данных в тех случаях, когда величина их заранее не известна. Дескриптор G имеет вид Qw.d При вводе дескриптор G эквивалентен дескриптору F. При вводе дескриптор G эквивалентен дескрипторам: Абсолютная вели- Эквивалентный деск- чина элемента дан- риптор преобразовав ных вещественного ния типа 0.1 <и< 1 F(w-4).d,4X 1<и< 10 F(o>-4).(d—l),4X 10 < и < 100 F(o;-4).(d-2)f4X 10*-2 < v < 10*-1 F(o>—4). 1,4Х 10*-1 < v < 10* _ F(w—4).0,4X В остальных слу- Ew.d чаях
150 12. Спецификация формата Дескриптор G позволяет печатать числа в удобной для восприятия форме — такой, которую обеспечивает формат F, и в то же время избежать ошибок, если числа оказались «слишком большими» или «слишком малыми». Пусть N — абсолютная величина элемента данных. Если N< <.01 или N^10*, то формат Gw.d эквивалентен формату kPEw.d, где k — значение текущего масштабирующего множителя. Имеется вариант дескриптора G вида Gw.dEe При вводе дескриптор Gw.dEe эквивалентен Gw.d. При выводе Gw.dEe эквивалентен Ew.dEe, если 0.1^N<1CK, и Ew.dEe, если N<0.1 или N>10d. 12.3.1.7'. Масштабирующий множитель Дескриптор масштабирующего множителя имеет вид kP где масштабирующий множитель k — целая константа, возможно со знаком. При вводе и выводе с дескриптором F воздействие масштабирующего множителя описывается соотношением Внешнее значение = внутреннее значение *10* Например, в результате выполнения инструкций А = 0.123 WRITE(6,9002)A 9002 F0RMAT(1H,2PF5.1) значение А будет напечатано в виде Й12.3 При вводе с дескриптором F, если читаемое значение содержит порядок, то масштабирующий множитель игнорируется. При вводе с дескрипторами Е и D, если читаемое значение содержит порядок, то значение масштабирующего множителя игнорируется, при выводе с этими дескрипторами число масштабируется в соответствии со значением k, но значение числа не искажается. Более точно, мантисса числа умножается на 10*, но при этом соответствующим образом изменяется и порядок числа. Например, в результате выполнения инструкций А-12.345 В = А WRITE(6,9003)A,B 9003 FORMAT(lH,E12.5,lPE12.5)
12.3. Дескрипторы преобразования 151 будет напечатано ¥0.12345ЕЙ02ДО1.2345ЕИ01 При вводе с дескриптором G: 1) если поле ввода не содержит порядка, то масштабирующий множитель оказывает такое же действие, как и при вводе с дескриптором F; 2) если поле ввода содержит порядок, то масштабирующий множитель не учитывается. При выводе по дескриптору G, если выводимое значение лежит в пределах действия дескриптора F, то масштабирующий множитель игнорируется. Если же действует дескриптор Е, то масштабирующий множитель оказывает такое же действие, как и при выводе с дескриптором Е. Если вместе с каким-либо подходящим дескриптором употреблен масштабирующий множитель, то это значение множителя становится текущим. Раз установленное, оно действует на все последующие дескрипторы преобразования F, E, D и G до тех пор, пока не встретится другой масштабирующий множитель. Для того чтобы отменить действие текущего масштабирующего множителя, нужно употребить дескриптор 0Р (т. е. «нуль Р») Таким образом, если масштабирующий множитель нужен только для одного дескриптора преобразования, то перед следующим дескриптором F, E, D или G нужно поставить дескриптор 0Р. 12.3.2. Редактирование логических данных Дескриптор L служит для ввода и вывода логических данных и имеет вид Lw где w — размер поля. Поле ввода для дескриптора L может содержать нуль или более пробелов, затем может стоять точка (а может и отсутствовать), затем обязательно буквы Т или F, за которыми могут следовать буквы, составляющие соответственно слова TRUE или FALSE. Логические константы .TRUE, и .FALSE, являются допустимыми формами для ввода значений соответственно «истина» и «ложь». При выводе значений «истина» и «ложь» поле состоит всегда из w—1 пробелов, за которыми следует соответственно буква Т или F. 12.3.3. Редактирование текстовых данных Для редактирования текстовых данных имеются три вида дескрипторов: дескриптор-цепочка, дескриптор Н и дескриптор А. Дескриптор-цепочка и дескриптор Н служат для включения в спецификацию формата описательной информации и могут использоваться только при выводе.
152 12. Спецификация формата 12.3.3.1. Дескриптор-цепочка Дескриптор-цепочка имеет вид текстовой константы. При выводе входящие в нее литеры переписываются из спецификации формата в запись, что проиллюстрировано в следующем примере: WRITE(N,9000)A 9000 FORMAT('SUM= \F6.2) Размер поля вывода равен числу литер в текстовой константе, за исключением двух крайних кавычек. Дескриптору-цепочке не соответствует никакой элемент в списке вывода. Кавычка внутри дескриптора-цепочки представляется в виде двух подряд стоящих кавычек. 12.3.3.2. Дескриптор Н Дескриптор Н служит для вывода холлеритовских данных и имеет вид wUxxx.. .х w литер где w — целая константа без знака, которая обозначает число литер, следующих за буквой Н и входящих в состав холлеритов- ского литерала. Дескриптору Н, как и дескриптору-цепочке, не соответствует никакой элемент в списке ввода-вывода, что проиллюстрировано в следующем примере: WRITE(N,9010)A 9010 FORMAT(7H SUM=,F6.2) В более ранних версиях языка Фортран дескриптор Н можно было использовать для ввода, при этом литеры из вводимой записи переписывались в инструкцию FORMAT. Впоследствии эти литеры можно было использовать при выводе, например, в качестве заголовка столбца. В Фортране 77 такая возможность не допускается^ дескриптор Н может использоваться только при выводе. 12.3.3.3. Дескриптор А Дескриптор А служит для редактирования текстовых данных и имеет вид Aw где w — размер поля данных в записи. Дескриптор А действует следующим образом (g — число литер в соответствующей текстовой переменной или элементе текстового массива):
12.3, Дескрипторы преобразования 1531 1. При вводе, если w^g, то из поля вводимой записи берутся g крайних правых литер; если w<g, то в левой части элемента данных текстового типа располагается w литер, а за ними следуют g—w пробелов. 2. При выводе, если w>gy то поле вывода состоит из w—g пробелов, за которыми следует g литер, взятых из выводимого элемента данных; если w^.g, то в поле вывода попадают w левых литер из элемента данных текстового типа. Допускается вариант дескриптора А вида А в котором размер поля опущен. Такой дескриптор можно использовать как при вводе, так и при выводе. Размер поля равен длине соответствующего текстового элемента данных из списка ввода-вывода. 12.3.4. Установка позиции в записи Позиционные управляющие дескрипторы редактирования служат для указания позиции в записи, начиная с которой будет происходить последующий ввод или вывод. Это средство позволяет установить нужную позицию в тексте внешней записи и дает возможность обрабатывать повторно или пропускать некоторые части записи при вводе. При выводе дескрипторы этой группы позволяют более точно описывать требуемое редактирование, а также выравнивать поля. 12.3АЛ. Дескриптор X Управляющий дескриптор редактирования X означает продвижение позиции в записи вперед по отношению к текущей позиции. Таким образом, управляющий дескриптор X служит для пропуска нескольких литер на внешнем носителе при вводе или выводе. Дескриптор X имеет вид wX где w — ненулевая целая константа без знака, указывающая* сколько литер нужно пропустить. При вводе w текстовых позиций в записи пропускаются независимо от их содержимого. Перед началом форматного вывода запись всегда заполняется пробелами. Поля данных помещаются в запись последовательно слева направо по мере выполнения преобразований и редактирования, предписываемых спецификацией формата. Управляющий дескриптор X означает просто продвижение текущей позиции в выводимой записи на несколько позиций, в которых остаются пробелы, если только туда не было выведено что-либо раньше. i
154 12. Спецификация формата 12.3.4.2. Дескриптор Т Управляющий дескриптор редактирования Т содержит ссыл- * ку на некоторый абсолютный номер позиции в выводимой или вводимой записи. Указанная позиция может находиться как левее, так и правее текущей позиции в записи; в результате обработки дескриптора Т текущей становится позиция с указанным номером. Дескриптор Т имеет вид Тс где с — ненулевая целая константа без знака, так что (при выводе) следующая литера будет выведена в позицию номер с записи или (при вводе) следующая литера будет взята из позиции номер с записи. 12.3.4.3. Дескриптор TL Управляющий дескриптор редактирования TL служит для перемещения указателя текущей позиции в записи назад. Дескриптор TL имеет вид TLs где s — целая константа без знака, показывающая на сколько позиций назад (т. е. влево) следует переместить текущую позицию во внешней записи данных. 12.3.4.4. Дескриптор TR Управляющий дескриптор редактирования TR служит для продвижения вперед текущей позиции в записи. Дескриптор TR имеет вид TRs где s — целая константа без знака, показывающая, на сколько позиций вперед (т. е. вправо) следует продвинуть текущую позицию во внешней записи данных. . 12.3.5. Дескрипторы управления записями Дескрипторы управления записями служат для указания о том, что обработку текущей записи следует завершить. Эти управляющие дескрипторы дополняют рассмотренный выше случай, когда спецификация формата оказывается* исчерпанной раньше, чем обработаны все элементы списка ввода-вывода. В этом случае управление в спецификации формата передается к последней открывающей скобке, и одновременно происходит переход к следующей записи.
J2.3. Дескрипторы преобразования 155 12.3.5.1. Наклонная черта Встретив в спецификации формата наклонную черту (/) в качестве самостоятельного дескриптора редактирования или в качестве разделителя, процессор переходит к обработке следующей записи. При вводе прочитывается новая запись и текущей становится ее первая позиция. При выводе п подряд стоящих черточек означают вывод п—1 пустых строк. Как и при вводе, текущей становится первая позиция новой записи. Употребив две или более наклонные черты подряд, можно пропустить несколько записей целиком при вводе или породить несколько записей, не содержащих литер, при выводе. В случае файлов прямого доступа переход к следующей записи означает переход к записи с номером, на единицу большим. 12.3.5.2. Двоеточие Если в спецификации формата встретилось двоеточие (:) в качестве самостоятельного дескриптора редактирования или в качестве разделителя и в списке вывода не осталось ни одного элемента, то процессор завершает выполнение операции вывода. Если двоеточие встретилось при вводе или при выполнении операции вывода в списке вывода еще остались элементы, то двоеточие игнорируется. ♦ 12.3.6. Управление выводом знака Дескрипторы этой группы управляют выводом знака плюс для чисел и влияют на работу дескрипторов преобразования I, F, E, D и G. Как и в случае масштабирующего множителя, действие дескриптора управления выводом знака продолжается до тех пор, пока не встретится другой дескриптор управления выводом знака. При вводе дескрипторы S, SP, SS игнорируются. 12.3.6.1. Дескриптор SP Управляющий дескриптор SP указывает процессору, что следует выводить знак плюс везде, где он возможен. 12.3.6.2. Дескриптор SS Управляющий дескриптор SS указывает процессору, что везде, где возможно, знак плюс следует опускать.
156 12. Спецификация формата 12.3.6.3. Дескриптор S Управляющий дескриптор S указывает процессору, что следует вернуться к стандартному режиму проставления знака плюс при выводе чисел. 12.3.7. Управление вводом пробелов Дескрипторы управления вводом пробелов указывают процессору, как следует интерпретировать пробелы, кроме старших пробелов, при вводе чисел. Режим ввода пробелов устанавливает спецификация "BLANK=" в инструкции OPEN или значение этой спецификации, принятое по умолчанию. Спецификация "BLANK=", управляющая вводом пробелов, действует с начала выполнения инструкции форматного ввода и до тех пор, пока в спецификации формата не встретится один из дескрипторов BN или BZ. 12.3.7А. Дескриптор BN Управляющий дескриптор BN. указывает процессору, что при вводе чисел пробелы следует игнорировать, а остальные литеры прижимать к правому краю поля, как если бы все опущенные пробелы располагались с левого края поля. Поле, состоящее из одних пробелов, соответствует нулевому значению. 12.3.7.2. Дескриптор BZ Управляющий дескриптор BZ указывает процессору, что при вводе чисел пробелы следует интерпретировать как нули. 12.3.8. Разделители в спецификации формата Разделителем между дескрипторами преобразования и управляющими дескрипторами редактирования служит запятая. Ее можно опускать перед и после наклонной черты и двоеточия, поскольку наклонная черта и двоеточие сами являются разделителями, а также между управляющим дескриптором Р и следующим за ним дескриптором преобразования F, E, D или G. В большинстве реализаций Фортрана не требуется разделитель после дескрипторов wX и шН '..Л Эта возможность не предусмотрена в стандарте Фортрана 77. 12.3.9. Коэффициент повторения Нулевая целая константа без знака, стоящая перед дескрип* тором преобразования, является коэффициентом повторения для этого дескриптора или для группового дескриптора. На-
I 12А. Ввод-вывод в свободном формате 157 пример, дескриптор 312 эквивалентен последовательности дескрипторов 12, 12, 12. Коэффициент повторения может отно- 1ситься и к заключенному в скобки списку дескрипторов преобразования и управляющих дескрипторов. Например, запись s 3(I4,F10.2) эквивалентна I4,F10.2,I4,F10.2,I4,F10.2. ) < 12.3.10. Групповой дескриптор j Заключенный в скобки список дескрипторов преобразования | и управляющих дескрипторов редактирования называется груп- \ повым дескриптором и используется либо с коэффициентом по- 1 вторения, либо для управления записями. Поясним это на I примере. Требуется прочитать значение N по формату 14, про- | битое на отдельной перфокарте, а с последующих карт ввести N значений по формату F12.6, пробитых по шесть на каждой карте. 1 Это можно сделать при помощи следующих инструкций: J REAL А(ЮО) | READ(5,9000)N,(A (I),I = 1 ,N) 1 9000 FORMAT (I4/(6F12.6)) I | В этом примере используется наклонная черта для перехода к | следующей перфокарте, коэффициент повторения, список де- [ скрипторов в скобках и возврат к последней открывающей | скобке. h I | 12.4. ВВОД-ВЫВОД В СВОБОДНОМ ФОРМАТЕ I Свободный'формат—это средство, позволяющее осуществ- 1 лять форматный ввод и вывод, не используя спецификации I формата. Значения данных на внешнем носителе отделяются | друг от друга при помощи запятой или одного или нескольких j пробелов. Перед и после запятой могут стоять пробелы. При ( вводе значение данных должно иметь тот же тип, что и соот- [ ветствующий элемент списка. Вводимые значения данных на J внешнем носителе должны иметь вид, допустимый для ввода в языке Фортран 77, они прочитываются из вводимой записи слева направо и используются для определения элементов списка > ввода инструкции READ, в которой в качестве спецификации \ формата указана звездочка. Последовательность значений может ) быть продолжена в следующих записях. Если между двумя | запятыми нет ничего, кроме пробелов, то подразумевается t пустое значение. Если во вводимой записи в качестве раздели- ( теля (т. е. не в текстовой константе) встретилась наклонная ) черта, то операция ввода завершается, а оставшимся элементам 1 списка ввода присваиваются пустые значения. Присваивание
158 12. Спецификация формата пустого значения элементу списка ввода не изменяет его значения, не меняется также статус определенности этого элемента. Вводимые значения могут иметь коэффициент повторения г*с г* где г — ненулевая целая константа без знака, представляющая собой коэффициент повторения, ас — некоторая константа языка Фортран 77. Форма записи тс обозначает последовательность из г констант с, а г* обозначает г пустых значений. При выводе элементы списка вывода записываются в одну или несколько последовательных записей в некотором подходящем формате, который зависит от реализации. Вводимые значения разделяются запятыми или пробелами.
13 СТРУКТУРА ПРОГРАММЫ 13.1. ОБЗОР Исполняемая программа составляется из следующих компонент: 1. Одна главная программа. 2. Нуль или более стандартных функций. 3. Нуль или более внешних процедур. 4. Нуль или более подпрограмм данных (BLOCK DATA). Кроме того, главная программа и внешние процедуры могут содержать так называемые функции-формулы (инструкции, представляющие собой описание внутренних функций), а также обращения к этим функциям. 13.2. ГЛАВНАЯ ПРОГРАММА Главная программа — это программная компонента, не являющаяся ни внешней процедурой, ни подпрограммой данных (BLOCK DATA). Главной программе передается управление процессором, когда исполняемая программа загружена и готова к выполнению. В исполняемой программе может быть только одна главная программа; главная программа распознается по первой инструкции, которая должна быть отлична от инструкций FUNCTION, SUBROUTINE и BLOCK DATA. Первой инструкцией главной программы может быть инструкция PROGRAM. 13.2.1. Инструкция PROGRAM Инструкция PROGRAM имеет вид PROGRAM прог где прог — имя главной программы. Необязательная инструкция PROGRAM служит для определения имени главной программы, которое должно быть уникальным среди глобальных имен данной исполняемой программы и не должно совпадать ни с одним локальным именем в главной программе.
160 IS. Структура программы 13.2.2. Структура главной программы Главная программа может содержать любые инструкции языка Фортран 77, за исключением упоминавшихся ранее инструкций FUNCTION, SUBROUTINE и BLOCK DATA ". Выполнение инструкций STOP или END в главной программе, так же как и выполнение инструкций STOP в любой программной компоненте исполняемой программы, приводит к завершению выполнения всей программы. Инструкция SAVE в главной программе не влияет на состояние переменных и массивов, поскольку для всех данных, определенных в главной программе, память отводится статически. 13.3. СТАНДАРТНЫЕ ФУНКЦИИ Стандартная функция — это функция, предоставляемая процессором. При обращении к ней генерируется либо встроенная функция (последовательность команд, непосредственно реализующая эту функцию), либо обращение к библиотечной функции. Стандартные функции, определенные в документе по стандарту как составная часть языка Фортран 77, перечислены в приложении А. Примеры стандартных функций: ABS — вычисление абсолютной величины, INT — преобразование к целому типу, SIN — синус, SQRT — корень квадратный. 13.3.1. Обращение к стандартной функции Обращение к стандартной функции имеет вид функ{а\уа\) где функ — универсальное или индивидуальное имя стандартной функции, а — фактический параметр. Фактические параметры а образуют список параметров, и их порядок, число и типы должны согласовываться с описанием данной функции, приведенным в приложении А. Фактическим параметром может быть любое правильное построенное выражение, кроме текстовых выражений, содержащих операцию конкатенации, с формальным параметром или с переменной, длина которой описана как звездочка в скобках. Обращение к стандартной функции может входить в выражение в качестве простого выражения, функция выполняется в процессе вычисления выражения. х> Д также инструкций ENTRY и RETURN.— Прим. перев,
13.2. Главная программа 161 Например, следующая инструкция содержит обращение к стандартной функции HYP=SQRT (X**2+Y**2) Результаты различных стандартных функций описаны в приложении А. 13.3.2. Универсальные имена Универсальное имя — это имя, данное некоторому классу объектов. Все стандартные функции языка Фортран 77, соответствующие одной и той же математической функции, например вычислению абсолютной величины, имеют одно общее имя, например ABS. Универсальным именем можно пользоваться независимо от типа параметра (параметров) функции. Для каждого обращения к стандартной функции по универсальному имени в зависимости от типа параметра (параметров) процессор обеспечивает обращение к соответствующей специфической функции. 13.3.3. Правила выполнения стандартных функций Все стандартные функции, за исключением функций преобразования типа, функции вычисления ближайшего целого и функции вычисления абсолютной величины комплексного числа г)9 дают результат того же типа, какой был у параметра (параметров). Если для функции допускается или требуется более одного параметра, то все параметры должны быть одного типа. Инструкция IMPLICIT не влияет на тип универсального или специфического имени стандартной функции. Если нужно употребить имя стандартной функции в качестве фактического параметра при обращении к внешней процедуре, то следует использовать специфическое имя функции, описав его в инструкции INTRINSIC в той программной компоненте, где находится обращение к внешней процедуре. Имена стандартных функций для преобразования типов, а также для вычисления минимума и максимума нельзя использовать в качестве параметров. 13.4. ФУНКЦИИ-ФОРМУЛЫ Функция-формула — это инструкция, содержащая определение функции, внутренней по отношению к той программной компоненте, где находится описание функции. Например, сле- х> А также функций LEN, INDEX, LGE, LGT, LLE, LLT, AIMAG, АМАХО, MAJC1, AMINO, MINI.— Прим. перев.
162 13. Структура программы дующая инструкция является функцией-формулой ROOT (А, В, С)=(—B+SQRT(B**2—4.0*A*C))/(2.0*A) при условии, что выполняются другие соглашения. Обращение к функции-формуле осуществляется так же, как обращение к стандартной функции; результат ее вычисляется в той точке программной компоненты, где и когда встретилось обращение. Таким образом, обращение к функции-формуле может использоваться в выражении в качестве первичного подвыражения, тип которого определяется по имени функции и может быть задан либо явно, либо неявно. 13.4.1. Определение функции-формулы Определение функции-формулы задается при помощи специальной инструкции-функции вида функ([с1[>с1]...])=выр где d — формальный параметр, вир — выражение. Через функ обозначено имя функции. Имя функции и выражение вир могут иметь разные тцпы. Здесь выполняются те же правила, что и в присваиваниях. Каждый формальный параметр является именем переменной определенного типа, значение которой выбирается при вычислении выр. Аргументы необязательно имеют один и тот же тип. Формальный параметр не может встречаться в списке формальных параметров функции-формулы более одного раза. Имя формального параметра функции-формулы может употребляться и в качестве имени реальной переменной в объемлющей программной компоненте. Один и тот же формальный параметр может встречаться в описаниях нескольких функций-формул в одной и той же программной компоненте. Имя функции-формулы и имена ее формальных параметров могут встречаться в инструкциях описания типа. Имя функции- формулы нельзя использовать для обозначения других объектов в той же программной компоненте, за исключением помеченных общих блоков. Простыми выражениями в выр могут быть не только имена формальных параметров, но и другие объекты, которые должны быть определены к моменту обращения к функции-формуле. Более точно, простыми выражениями в выр могут быть: 1. Имена формальных параметров 2. Константы 3. Параметры (поименованные константы) 4. Переменные 5. Элементы массивов
13.5. Внешние процедуры 163 6. Обращения к стандартным функциям 7. Обращения к внешним функциям 8. Обращения к формальным процедурам 9. Обращения к другим функциям-формулам 10. Выражения, составленные из элементов 1—9, заключенные в скобки Если в вир есть обращения к функциям-формулам, то эти функции должны быть определены выше; нельзя также обращаться к определяемой функции. Последнее утверждение означает по существу, что рекурсивные функции-формулы не допускаются. Описание функции-формулы должно предшествовать всем исполняемым инструкциям данной программной компоненты. 13.4.2. Обращение к функции-формуле Обращение к функции-формуле записывается как имя функции, за которым следует список фактических параметров, если они есть, в скобках; обращение к функции-формуле может использоваться в качестве первичного подвыражения и имеет вид функ ([врж[,врж...]) где функ — имя функции-формулы, а врж — выражения, вычисляемые в момент обращения к функции. Порядок, число и типы выражений должны быть согласованы с формальными параметрами в описании функции-формулы. Перед выполнением функции-формулы выражения вычисляются и передаются ей в качестве аргументов; затем вычисляется выражение вир, фигурирующее в определении функции- формулы, и его значение преобразуется, если надо, к типу функции функ. Полученное значение и является результатом данного обращения к функции-формуле. Выражения-аргументы функции не должны содержать операции конкатенации, один из операндов которой является формальным параметром или переменной, длина которой описана как звездочка в скобках. 13.5. ВНЕШНИЕ ПРОЦЕДУРЫ Внешняя процедура — это программная компонента, которая существует как самостоятельный объект; она может быть запрограммирована на Фортране 77 или другими средствами. Мы будем рассматривать только внешние процедуры, написанные на Фортране. Тем не менее новый стандарт Фортрана, как и стандарт 1966 г., допускает внешние процедуры, запрограмми-
164 13. Структура программы рованные на других языках, воспринимаемых данным процессором х). 13.5.1. Виды внешних процедур В Фортране 77 различаются два вида внешних процедур — подпрограммы-функции и подпрограммы. Для удобства подпрограммы-функции называют обычно просто функциями. Функция состоит из инструкции FUNCTION и тела функции, которое заканчивается инструкцией END; общая структура функции такова: FUNCTION имя ([а[, а]...]) . > Тело функции END Обращение к функции может быть простым выражением в выражении, находящемся в другой программной компоненте той же исполняемой программы. Подпрограмма состоит из инструкции SUBROUTINE и тела, которое заканчивается инструкцией END; общая структура подпрограммы такова: SUBROUTINE имя [(а[,а]...])] .> Тело подпрограммы END Обратиться к подпрограмме можно при помощи инструкции CALL, находящейся в другой программной компоненте той же исполняемой программы. 13.5.2. Выполнение внешней процедуры Внешняя процедура выполняется следующим образом: 1. Внешняя процедура активируется при обращении к функции или при выполнении инструкции CALL в зависимости от того, является ли внешняя процедура соответственно функцией или подпрограммой. 2. Вычисляются выражения-аргументы процедуры. 1} В данном случае под словом «процессор» понимается общее операционное окружение, включая операционную систему и имеющиеся языковые процессоры.
13.5. Внешние процедуры 165 3. Фактические параметры, переданные из обратившейся программной компоненты, ассоциируются с формальными параметрами процедуры. 4. Инструкции, составляющие тело процедуры, выполняются в том порядке, который диктуется последовательностью действий программной компоненты. 5. Управление возвращается вызывающей программной компоненте в результате выполнения инструкции RETURN или если в вызываемой процедуре выполнится инструкция END. Имя функции должно хотя бы один раз быть использовано в теле этой функции в качестве переменной. При выполнении функции эта переменная должна быть хотя бы однажды определена. После того как эта переменная определена, можно выбирать ее значение, а также переопределять ее. Когда управление возвращается в вызывающую программу, то именно значение этой переменной и будет результатом обращения к внешней функции. Значение функции вычисляется в той точке вызывающей программной компоненты, где и когда встретилось обращение к функции. Тип результата обращения к функции должен совпадать с типом имени функции, описанным в самой функции, а если тип текстовый, то и длины должны совпадать. Если длина переменной, представляющей имя функции, описана в этой функции как звездочка в скобках, то берется длина, указанная в вызывающей^ программной компоненте. Переменная текстового типа, представляющая имя функции, не должна участвовать в операциях конкатенации в теле функции, но может быть определена при помощи инструкции присваивания. Вызов подпрограммы не может быть простым выражением в выражении, поскольку при вызове подпрограммы не возвращается какого-либо одного явного результата. Тем не менее подпрограмма, так же как и функция, может передать в вызывающую программную компоненту значения, определив ими в процессе выполнения один или более из своих аргументов. 13.5.3. Инструкция FUNCTION Инструкция FUNCTION имеет вид [тип] FUNCTION функ №&...]) Возможно, отсутствующий тип может быть одним из типов INTEGER REAL DOUBLE PRECISION COMPLEX
166 13. Структура программы LOGICAL CHARACTER [»дл] и специфицирует тип имени функции, который в свою очередь определяет тип возвращаемого результата. Все эти типы рассматривались выше в гл. 7 «Описательные инструкции». Через функ обозначено имя внешней функции, к которому, если тип не указан явно, применяются правила неявного определения типа. Это имя является внешним в данной исполняемой программе и в качестве такового должно быть уникальным. Например, две внешние процедуры не могут иметь одно и то же имя. Спецификация типа в инструкции FUNCTION может быть опущена, а тип имени функции можно указать в инструкции описания типа. Нельзя только описывать тип имени функции дважды — ив инструкции FUNCTION, и в инструкции описания типа. Пример: следующие инструкции FUNCTION CROOT(A,B,C) COMPLEX CROOT эквивалентны инструкции COMPLEX FUNCTION CROOT (A,B,C) Имя формального параметра d может быть именем переменной, именем массива или именем формальной процедуры. Имя формального параметра является локальным в данной программной компоненте, и оно не должно появляться в инструкциях EQUIVALENCE, PARAMETER, SAVE, INTRINSIC, DATA или COMMON в теле этой функции. Имя помеченного общего блока может совпадать с именем формального параметра. 13.5.4. Обращение к внешней функции Обращение к внешней функции имеет вид функ(\а[,а\...\) где функ — имя внешней функции, а — фактический параметр. Фактические параметры, их порядок, число и типы должны быть согласованы со списком формальных параметров вызываемой функции. Если в списке формальных параметров вызываемой функции есть формальная процедура, то в соответствующей позиции в списке фактических параметров должно стоять имя фактической процедуры. Если формальная процедура является функцией, то тип функции, передаваемой в качестве фактического параметра, должен совпадать с типом формальной процедуры в вызываемой функции. Если передается стандартная функция, то следует указать ее специфическое имя. В случае когда фор-
13.5. Внешние процедуры 167 мальная процедура является подпрограммой, понятие типа не применимо. Фактическим параметром в обращении к функции может быть: 1. Выражение, кроме текстовых выражений, содержащих операцию конкатенации, один из операндов которой является формальным параметром или переменной с длиной, описанной в виде звездочки в скобках 2. Имя массива 3. Имя стандартной функции 4. Имя внешней процедуры 5. Имя формальной процедуры Поскольку допускается передача имени формальной процедуры в качестве фактического параметра, значит, имя процедуры можно передать через несколько уровней обращений к программным компонентам. Дополнительные сведения о передаче параметров будут даны ниже. 13.5.5. Инструкция SUBROUTINE Инструкция SUBROUTINE имеет вид SUBROUTINE подпр [(d[,d]..J)] Имя подпр — это внешнее имя подпрограммы, первой инструкцией которой является данная инструкция SUBROUTINE, ad — формальный параметр, который может быть: 1. Именем переменной 2. Именем массива 3. Именем формальной процедуры 4. Звездочкой Звездочкой обозначается альтернативный возврат, применение которого проиллюстрировано в следующем примере. Рассмотрим процедуру SUBROUTINE BSCALE(A,B,C,*,*,*) IF (A .LT. 0.0) RETURN 1 IF (A .EQ. 0.0) RETURN 2 RETURN 3 END и ее вызов CALL BSCALE (X+Y,LOG(Z),1.54,*1000,*2000,*3000)
168 13. Структура программы Константы 1000, 2000 и 3000 — это метки исполняемых инструкций в вызывающей программной комлоненте. В подпрограмме BSCALE, если значение А меньше нуля, то в результате выполнения инструкции RETURN1 управление будет передано инструкции с меткой, указанной в качестве фактического параметра, соответствующего первой звездочке в списке формальных параметров, т. е. управление будет передано инструкции с меткой 1000 в вызывающей программе. Аналогично, если А равно нулю, управление будет передано инструкции с меткой 2000 в вызывающей программе. В остальных случаях в результате выполнения инструкции RETURN3 управление будет передано инструкции с меткой, переданной в качестве фактического параметра, который соответствует третьей звездочке. В данном случае это будет инструкция с меткой 3000. Для подпрограммы без параметров допустимы две формы инструкции: SUBROUTINE подпр и SUBROUTINE подпр ( ) 13.5.6. Инструкция CALL Обратиться к подпрограмме можно при помощи инструкции CALL, которая имеет вид CALL подпр [([а[,а]...])1 где подпр — имя подпрограммы, а — фактический параметр. Параметры а образуют список фактических параметров, и их порядок, число и типы должны быть согласованы с соответствующими формальными параметрами вызываемой подпрограммы. Если некоторый формальный параметр вызываемой подпрограммы является процедурой, то в соответствующей позиции в списке фактических параметров инструкции CALL должно стоять имя фактической процедуры. Если формальная процедура является функцией, то тип фактической функции, передаваемой в инструкция CALL, необходимо согласовать с типом соответствующей формальной функции. Если передается стандартная функция, то следует указать ее специфическое имя. В случае когда процедура является подпрограммой, понятие типа неприменимо. Если некоторый параметр вызываемой подпрограммы является звездочкой, то в соответствующей позиции в списке фактических параметров инструкции CALL должна стоять метка инструкции,
13.5, Внешние процедуры 169 В качестве фактического параметра в инструкции CALL можно употребить холлеритовскую константу; соответствующий формальный параметр должен иметь целый, вещественный или логический тип. Холлеритовский тип исключен из языка Фортран 77, и приведенная выше информация включена для тех организаций, которые желают расширить язык, оставив в нем и холлеритовский тип. Фактическим параметром в инструкции CALL может быть: 1. Выражение, кроме выражений с операцией конкатенации, один из операндов которой является формальным параметром или переменной с длиной, заданной в виде звездочки в скобках. 2. Имя массива. 3. Имя стандартной функции. 4. Имя внешней процедуры. 5. Имя формальной процедуры. 6. Спецификация альтернативного возврата вида *s, где s — метка исполняемой инструкции. Как и в случае внешних функций, благодаря возможности использовать в списке фактических параметров имя формальной процедуры можно передать имя фактической процедуры на несколько уровней обращения к процедурам. Дополнительная информация о передаче параметров будет приведена ниже. Если подпрограмма не имеет параметров, т. е. была описана при помощи инструкции вида SUBROUTINE подпр или SUBROUTINE подпр ( ), то вызвать ее можно при помощи инструкции CALL вида CALL подпр или CALL подпр ( ). Обе формы записи полностью взаимозаменяемы как для инструкции CALL, так и для инструкции SUBROUTINE. 13.5.7. Инструкция ENTRY Инструкция ENTRY служит для описания входной точки в функции или подпрограмме. Инструкция ENTRY записывается в теле внешней процедуры ниже инструкции FUNCTION или SUBROUTINE и имеет вид ENTRY вход [([d[,d]...])] где вход — имя входной точки, d — формальный параметр. Если инструкция ENTRY встречается в теле функции, то она обрабатывается так же, как инструкция FUNCTION. Если инструкция ENTRY встречается в теле подпрограммы, то она обрабатывается так же, как инструкция SUBROUTINE. К входной точке функции обращаются так же, как к функции. К входной точке подпрограммы обращаются при помощи
170 13, Структура программы инструкции CALL. Порядок, число, типы и имена формальных параметров в инструкции ENTRY не обязательно должны согласовываться со списком формальных параметров в инструкции FUNCTION или SUBROUTINE, которая является первой инструкцией объемлющей внешней процедуры. Но при обращении к входной точке порядок, число и типы фактических параметров должны согласовываться со списком формальных параметров в соответствующей инструкции ENTRY. 13.5.8. Инструкция RETURN J Инструкция RETURN приводит к возврату из процедуры I в вызывающую программную компоненту и может иметь одну 1 из форм: 1 RETURN j или I RETURN [е] 1 Вторая форма может использоваться только в подпрограммах; I целое выражение е специфицирует альтернативный возврат, уже J обсуждавшийся выше. Если 1^е^пу где п — число звездочек 1 в инструкции SUBROUTINE или ENTRY, то управление будет I передано инструкции с меткой, которая была указана в ин- 1 струкции CALL в качестве фактического параметра, соответст- I вующего е-и звездочке в инструкции SUBROUTINE или ENTRY. I Если е меньше 1 или е больше п, то происходит обычный возврат. | При выполнении инструкции RETURN (равно как и ин- I струкции END) становятся неопределенными все объекты внеш- 1 ней процедуры, за исключением следующих: | 1. Объекты, перечисленные в инструкции SAVE J 2. Объекты непомеченного общего блока I 3. Объекты, инициализированные при помощи инструкции 1 DATA, которые не были переопределены и не стали неопреде- I ленными I 4. Объекты помеченных общих блоков, описанных в про- |^ цедуре, из которой осуществляется возврат, а также в других « программных компонентах, которые прямо или косвенно об- ] ращаются к рассматриваемой внешней процедуре | Таким образом, объект, описанный в помеченном общем блоке ] в некоторой программной компоненте, не может стать неопре- | деленным в результате выполнения инструкции RETURN в подчиненной программной компоненте.
13.5, Внешние процедуры 171 13.5.9. Инструкция END Инструкция END имеет вид END Она служит фактическим концом программной компоненты. Когда выполнение программы доходит до инструкции END, производятся следующие действия: 1. Если инструкция END встретилась в главной программе, то заканчивается выполнение всей программы. 2. Если инструкция END встретилась во внешней процедуре, то осуществляется неявный возврат в вызывающую программную компоненту. При выполнении неявного возврата происходят те же действия, что и при выполнении инструкции RETURN. 13.5.10. Передача массивов в качестве параметров внешних процедур Массив можно передать в качестве фактического параметра функции или подпрограмме при условии, что соответствующий формальный параметр является массивом, который описан в инструкции DIMENSION или в инструкции описания типа, но не в инструкции COMMON. Размер массива в вызывающей программной компоненте не должен превышать размер соответствующего формального массива в функции или подпрограмме х). Массив в функции или подпрограмме может иметь также регулируемые измерения. В следующем примере подпрограммы для транспонирования матриц проиллюстрировано применение массивов с регулируемыми измерениями: SUBROUTINE TRANSP(A,M,N,B) REAL A(M,N),B(N,M) DO 50 I = 1,M DO 50 J = 1,N 50 B(J,I) = A(I,J) RETURN END X) Измерения массива в вызывающей программной компоненте и в вызываемой функции или подпрограмме не обязательно должны совпадать, поскольку массив занимает последовательные единицы памяти.
172 13. Структура программы Вызов этой подпрограммы мог бы выглядеть так: REAL РМАТ(15,Ю), RMAT(10,15) CALL TRANSP(PMAT,15,10,RMAT) Спецификация массива с регулируемыми измерениями в функции или подпрограмме — это единственный случай, когда описатель массива может содержать переменную. В декларации массива с регулируемыми измерениями по крайней мере одно измерение должно быть описано при помощи переменной, которая является либо формальным параметром, либо переменной в общем блоке. Когда массив или элемент массива передается в качестве параметра функции или подпрограмме, то передается его адрес, а не сами значения данных. Поэтому можно ассоциировать часть массива в обратившейся программной компоненте с формальным массивом в вызываемой функции или подпрограмме. ЛИТЕРАТУРА American National Standards Committee, American Standard Programming Language FORTRAN (FORTRAN 77), Document X3J3/90, X3 Secretariat, CBEMA/Standards, 1828 L Street, N. W., Washington, D. C, 20036. American Standard FORTRAN, New York:American Standards Association, Inc., 1966. Draft Proposed ANS FORTRAN, SIGPLAN Notices, 11(3), March 1976. IBM System/360 and System/370 FORTRAN IV Language, IBM Corporation, New York, Form # GC28—6515, 1974. Katzan H., Introduction to Programming Languages, Philadelphia: Auerbach Publishers Inc., 1973. Woolley John D., FORTRAN: A Comparison of the New Proposed Language (1976) to the old Standard (1966), SIGPLAN Notices, 12(7), July 1977, p. 112—125. FORTRAN 77 STANDARD DOCUMENT American National Standard Programming Language FORTRAN, X3. 9-1978, ANSI, 1430 Broadway, New York, N.Y. 10018.
ПРИЛОЖЕНИЕ А СТАНДАРТНЫЕ ФУНКЦИИ Стандартная функция Преобразование типа 4 Определение ' Преобразование к це- ' лому типу Преобразование к вещественному типу Преобразование к типу двойной точности Преобразование к комплексному типу Преобразование к це- i лому типу I Число параметров 1 1 1 1 ИЛИ 1 2 1 1 1 Универсальное имя INT REAL DBLE CMPLX — 1 Специфическое имя шт IFIX IDINT REAL FLOAT SNGL — — ICHAR I Тип параметра [ Целый [ Вещественный ' Вещественный Двойной точности Комплексный Целый Целый Вещественный Двойной точности Комплексный Целый Вещественный Двойной точности Комплексный Целый Вещественный Двойной точности Комплексный Текстовый | функции 1 Целый 1 Целый ' Целый Целый Целый Вещественный Вещественный Вещественный Вещественный Вещественный Двойной точности Двойной точности Двойной точности Двойной точности Комплексный Комплексный Комплексный Комплексный Целый
Продолжение прилож. А ^ Стандартная функция ф Целая часть Ближайшее целочисленное значение Ближайшее целое Абсолютная величина Остаток Изменение знака Определение Преобразование к текстовому типу int (a) int (a+-5), еслиа^О int (а—.5), если а < 0 int (а+.5),еслиа^0 int (а—.5), если а < 0 (ar*+ai2)lf* ах —int (аг1аъ)*аъ | ах |, если а2^0 —\ai\9 если а2 < 0 Число параметров 2 2 Универсальное имя — AINT ANINT NINT ABS MOD SIGN Специфическое имя CHAR AINT DINT ANINT DNINT NINT IDNINT IABS ABS DABS CABS MOD AMOD DMOD ISIGN SIGN DSIGN V Тип параметра Целый Вещественный Двойной точности Вещественный Двойной точности Вещественный Двойной точности Целый Вещественный Двойной точности Комплексный Целый Вещественный Двойной точности Целый Вещественный Двойной точности функции Текстовый Вещественный Двойной точности Вещественный Двойной точности Целый Целый Целый Вещественный Двойной точности Вещественный Целый Вещественный Двойной точности Целый Вещественный Двойной точности
Продолжение прилож. А Стандартная функция Положительная разность Произведение двойной точности Выбор максимального значения Выбор минимального значения Длина Индекс подцепочки Определение «1—а2, если ах>а2 0, если ах<а2 ai*a2 max (alf a2,...) min(ab я2,...) Длина текстового объекта Позиция подцепочки а2 в подцепочке аг Число параметров 2 2 ^2 ^2 1 2 Универсальное имя DIM — МАХ — MIN — — — Специфическое имя IDIM DIM DDIM DPROD МАХО АМАХ1 DMAX1 АМАХО МАХ1 MIN0 AMIN1 DMIN1 AMINO MINI LEN INDEX Тип параметра Целый Вещественный Двойной точности Вещественный Целый Вещественный Двойной точности Целый Вещественный Целый Вещественный Двойной точности Целый Вещественный Текстовый Текстовый функции Целый Вещественный Двойной точности Двойной точности Целый Вещественный Двойной точности Вещественный Целый Целый Вещественный Двойной точности Вещественный Целый Целый Целый
Продолжение прилож. А ^ <л Стандартная функция Лексикографически больше или равно Лексикографически больше Лексикографически меньше или равно Лексикографически меньше Мнимая часть комплексного аргумента Сопряженное значение от комплексного Корень квадратный Экспонента Определение ах^а2 \ ах>а2 аг^а2 at<a2 ai (аг,—ы) (*Р* е ** а Число параметров 2 2 2 2 1 1 1 Универсальное имя — — — — — — SQRT ЕХР Специфическое имя LGE LGT LLE LLT AIMAG CONJG SQRT DSQRT CSQRT EXP DEXP CEXP Тип параметра Текстовый Текстовый Текстовый Текстовый Комплексный Комплексный Вещественный Двойной точности Комплексный Вещественный Двойной точности Комплексный функции Логический Логический Логический Логический Вещественный Комплексный Вещественный Двойной точности Комплексный Вещественный Двойной точности Комплексный
Продолженив прилож. А Стандартная функция Натуральный логарифм Десятичный логарифм Синус Косинус Тангенс Арксинус Определение In (a) logio (^ sin (a) cos (a) tg(e) arcsin (a) Число параметров 1 1 1 1 1 1 Универсальное имя LOG LOG 10 SIN COS ! TAN ASIN Специфическое имя ALOG DLOG CLOG ALOGIO DLOGIO SIN DSIN CSIN COS DCOS CCOS TAN 1 DTAN ASIN DASIN Тип параметра Вещественный Двойной точности Комплексный Вещественный Двойной точности Вещественный Двойной точности Комплексный- Вещественный Двойной точности Комплексный Вещественный Двойной точности Вещественный Двойной точности функции Вещественный Двойной точности Комплексный Вещественный Двойной точности Вещественный Двойной точности Комплексный Вещественный Двойной точности Комплексный Вещественный Двойной точности Вещественный Двойной точности
Продолжение прилож. А Стандартная функция 1 Арккосинус Арктангенс Синус гиперболический Косинус гиперболический Тангенс гиперболический Определение arccos (a) arctg (a) arctg (ajcib) sinh(s) cosh (a) tanh(a) Число параметров 1 , 1 2 1 1 1 Универсальное имя ACOS , ATAN ATAN2 SINH COSH TANH Специфическое имя ACOS DACOS ATAN DATAN ATAN2 DATAN2 SINH DSINH COSH DCOSH TANH DTANH Тип параметра Вещественный ( Двойной точности Вещественный Двойной точности 1 Вещественный Двойной точности Вещественный Двойной точности Вещественный Двойной точности Вещественный Двойной точности функции Вещественный Двойной точности Вещественный Двойной точности Вещественный Двойной точности 1 Вещественный Двойной точности Вещественный Двойной точности Вещественный Двойной точности
179 ПРИЛОЖЕНИЕ В СИНТАКСИС ИНСТРУКЦИЙ ФОРТРАНА Структура инструкции Название ASSIGN м ТО i BACKSPACE u BACKSPACE (асписок) BLOCK DATA [подпр] CALL подпр [([а[, а]...])] CHARACTER [*длина [,]] имя [,имя]... CLOSE (зсписок) COMMON[/[o6]/] ссписок[[,]/об]/ список]... COMPLEX п [, п]... CONTINUE DATA спимен/спконст/[[, ]спимен/ спконст/]... DIMENSION м(р)[,м(р)]... DO м[, ] i = Bbipi, выр2 [, выр3] DOUBLE PRECISION п[,п].., ELSE ELSE IF (выр) THEN END END IF ENDFILE u ENDFILE (асписок) ENTRY вход[([(1[,(1]...])] EQUIVALENCE (список)[^список)]... EXTERNAL проц[, проц]... FORMAT сф Функ([(1[, d]...]) = Bbip [тип] FUNCTION Функ([с1[,с1]...]) GOTOi[[,](M[,M]„.)] GOTO м GOTO [(м[,м]...)[,]1 !F (выр)инстр IF (выр)мьм2, м$ IF (выр) THEN Инструкция присваивания метки Инструкция установки позиции в файле Инструкция BLOCK DATA Вызов подпрограммы: инструкция CALL Инструкция описания текстового типа Инструкция CLOSE Инструкция COMMON Инструкция описания комплексного типа Инструкция CONTINUE Инструкция DATA Инструкция DIMENSION Инструкция DO Инструкция описания типа двойной точности Инструкция ELSE Инструкция ELSE IF Инструкция END Инструкция END IF Инструкция установки позиции в файле Инструкция ENTRY Инструкция EQUIVALENCE Инструкция EXTERNAL Инструкция FORMAT Функция-формула Инструкция FUNCTION Инструкция перехода по предписанию Инструкция безусловного перехода Инструкция, вычисляемого перехода Логическая инструкция IF Арифметическая инструкция IF Структурная инструкция IF 7*
180 Продолжение прилож. В Структура инструкции IMPLICIT тип(а[,а]...) [,гип(а[,а]. ..)]... INQUIRE (ифсписок) INQUIRE (иксписок) INTRINSIC функц [,функц]... LOGICAL п [, п]... OPEN (осписок) PARAMETER (пар=в [, пао=в]... PAUSE [п] PRINT f [,ввсп] PROGRAM прог READ (уисп) [ввсп] READ f [,ввсп] REAL п[,п]... RETURN [e] REWIND u REWIND (асписок) SAVE[a[,a]...] STOP [n] SUBROUTINE подпр [([d[,d]...])] пер=выр пер=выр пер=выр WRITE (уисп) [ввсп] Название Инструкция Инструкция Инструкция IMPLICIT информации о файле информации о канале Инструкция INTRINSIC Инструкция Инструкция Инструкция Инструкция Инструкция Инструкция Инструкция Инструкция Инструкция типа Инструкция Инструкция описания логического типа OPEN PARAMETER PAUSE вывода данных PROGRAM ввода данных ввода данных описания вещественного RETURN установки позиции в файле Инструкция SAVE Инструкция Инструкция Инструкция Инструкция ческая Инструкция Инструкция STOP SUBROUTINE присваивания логическая присваивания арифмети- присваивания текстовая вывода данных _^_
181 ПРИЛОЖЕНИЕ С СИНТАКСИЧЕСКИЕ ДИАГРАММЫ ЯЗЫКА ФОРТРАН 77 3 4 исполняемая программа: • главная_программа- ■ функция - подпрограмма ■ подпрограмма_данных ■ (1) В исполняемой программе должна быть ровно одна главная программа. Исполняемая программа может содержать внешние процедуры, запрограммированные не на Фортране. 2 главная_лрограмма:- - инструкция_ргодгат - функция :- подпрограмма :- 5 подпрограмма, данных - инструкция.? unction — - инструкция .subroutine—J - инструкция _block_data —J «i ■ метка —у" ■ MHGTpyKUHfl._format • инструкция .entry ■ инструкция, parameter - - инструкция, implicit — -у метка - ^- -инструкция.format ■ -инструкция .gentry - инструкция, parameter ■ -другие, описательные., инструкции-
182 метка« • инструкция_тогтат ■ -инструкция..entry — - инструкция^data — • функция в формула -*г— метка -у Б инcтpyкция_foгmat инструкция„ептгу — MHctpyK^fl^data <— исполняемая_инструкция - метка з. END (2) Главная лроерамма не может содержать инструкций ENTRY и RETURN. (5) Подпрограмма данных может содержать только инструкции IMPLICIT, PARAMETER, DIMENSION, COMMON, SAVE, EQUIVALENCE, DATA, END и инструкции описания типа. другие^ описательные „инструкции: — инструкция „dimension —— инструкция „equivalence инструкция „common - инструкция,, описания „типа - инструкция „external - инструкция^intrinsic ■ • инструкция _save ——-
183 исполняемая_ инструкция: — инструкция_присваивания - — инструкция^ goto инструкция_jf_ арифметическая —J . инструкция _if_логическая инструкция_1т*_структурная инструкция _else_if ■ инструкция _ else ———-— инструкция _end_if ———_ инструкция _ do ——— инструкция ^continue инструкция _ stop инструкция _ pause - инструкция __ read — инструкция_ write - инструкция^, print - инструкция _ rewind - инструкция_backspace HHcTpyKU.nfl_endfile — инструкция _ореп — инструкция_ close ■ инструкция _ inquire — инструкция call инструкция ^return (7) Инструкция END также является исполняемой инструкцией и должна быть последней инструкцией программной компоненты и нструкция_ program: — инструкция _ ептгу: t вход__функции ] PROGRAM имя_программы— - вход ..подпрограммы -
184 10 MHCTpyKuufl_function: — INTEGER — REAL DOUBLE PRECISION- •COMPLEX LOGICAL • CHARACTER- n * олисатель_длины FUNCTION 11 вход _$ункции : —#~ E NTRY - —*— имя функции ч 7 ( F имя_переменнои - имя_массива имя ^процедуры • •>■ (11) В инструкции FUNCTION скобки обязательны 12 инструкция^эиЬгоиШе: — SUBROUTINE- 13 эход_подпрограммы:-#— ENTRY п > \ имя —подпрограммы-^ — С —» имя_переменной- имя_масс'ива имя „.процедуры ■ - * ■ ■'■ J4 инструкция_Ыоск_сЫа: *— BLOCK DATA \% ■ имя„подпрограммы„данных ч 15 инструкция^сИтепзюп: DIMENSION- -^— олисатель_массива ч
185 16 описателъ_массива: ■ •имя массива с -) -у-/74-^ Bbtp_j граница_индекса: IX ) - выр_ граница_индекса< (16) Звездочка может встречатъсй только в описателе массива-формального параметра (5.1.2.2) XI инструкция ^equivalence: EQUIVALENCE ( — о6ъект_эквив - D Г! -объект эквив - п 18 объект эквив: имя_леременнои - имя_элемента_ массива • имя_массива I— имя_лодцепочки (18) В инструкции EQUIVALENCE любое выражение в индексе или подцепочке должно быть целым константным выражением. 19 инструкция_соттоп: COMMON х имя_о6щего_ блока Т 5L хи имя_ переменной ■ массива ЬИМЯ_1 имя_ пписа описатель массива-
20 инструкция_описания_типа — INTEGER — REAl DOUBLE PRECISION- COMPLEX -LOGICAL имя константы < имя_переменнои имя_массива — имя_функции — описатель массива • CHARACTER i * описатель_дпины - то имя^ константы — имя.переменной — имя_массива I4— имя_функции описатель_массива - т * описатель_ длины - 21 инструкция_*1тр\1сК: •— IMPLICIT ■ -INTEGER REAL DOUBLE PRECISION COMPLEX LOGICAL CHARACTER г C7 буква■ * описатель_длины - ^— - буква J ZL
( * ) t Ь ненулевая..целая_конст_без_энака v—— с целое_конст_выражение ) — 23 инструкция^.parameter : ^-#- PARAMETER - ( -7— имя_константы = конст_выражение т ) - 24 инструкция^ external: L- EXTERNAL —р—? имя_лроцедуры — f V-#— имя_подлрограммы_данных- 25 инструкция _ intrinsic: lfTRlNSIC 26 инструкция^ауе: W- SAVE имя_ функции имя _лвременной ■ имя массива — 4— / имя_общего _ блока / 27 инструкция_<*ата: ^- DATA —ч имя_переменной ■ имя_элемента_массива - имя массива имя_подцепочки« - неявный_слисок_до_данных - U \— ненулевая_целая_конст_без_знака - имя^константы константа имя константы ■ "СГт *-1 г 1_
ids неявт 25 деявный.список. do_ данных: имя ^элемента ^массива- неявный_ список nz; массива ч _do_ данных -J имя_переменной = с D целое^конст^выражениеу— f целое_конст_выражениет— ) — т -ъ- г 29 инструкция „присваивания: имя_переменной — имя_элемента_массива - имя_подцепочки выражение — ASSIGN метка ТО имя.переменной 30 инструкция_перехода: — инструкция, безусловного.перехода —- инструкция—вычисляемого. перехода — инструкция_перехода_по_предпис 31 инструкция_беэусловного_перехода— GOTO и да s >да J анию / 32 инструкция, вычисляемого, перехода ^- 60 ТО С —j- метка -у- ) \ • / целое.выражение- 33 инструкция_перехода.ло_предписанию: ^-60 ТО имя.переменной л *— к. ~"7~ метка л " ) 34 инструкция, if .арифметическая: IF ( целое_ве1цеств'^д,вшдочн_выр) метка, метка, метка-
189 35 инструкция_гт*_ логическая: ' IF ( логич_выражение) исполняемая^ инструкция С35) Исполняемая инструкция в логической инструкции IF не может быть инструкцией DO, IF структурной , ELSE IF, ELSE, END IF, END или другой логической инструкцией IF. 56 инструкциям^структурная: IF ( логич_выражение ) THEN ■ 37 инструкция else_tf: ELSE IF ( логич_выражение ) THEN 38 инструкция^ else: • ELSE 39 инструкция^епсМт": -•- END IF 40 инструкция_<Ь: DO метка ■ Г, целое, веществ^дв^точн^выр-у- П\ ) -имя_ переменной - целое_ веществ_дв_точн_выру, целое.веществ^дв^точн^выр -г* 41 инструкция^continue : CONTINUE 42 инструкция_бтор: STOP ——— 43 инструкция^рацБе ; PAUSE цисрра текстовая_константа -
190 44 инструкция „write: 45 инструкция_геао! : 46 инструкция_рппт. ; 48 WRITE READ ■ PRINT с ( слисок_упр_ижр ) идентификаторуформата Т1 .ввшсписок ■ 47 список_упр_инф: идентификатор_канала -/^\- ._Г FMT = ^— идентификатор^ формата- UNIT = идвнтификатор^канала REC = целое_выр END = метка ERR = метка ^—I0STAT = -г— имя_переменной ■ ■ имя элемента массива ■ (47) список_упр_инф должен содержать ровно один идентификатор канала. Спецификация END= в инструкции WRITE не допускается. вв_ список: •— выражение имя_ массива неявныи_цикл_вв • (48) Выражение в списке ввода-вывода инструкции READ может быть только именем переменной, именем элемента массива или именем текстовой подцепочки.
191 49 неявный., цикл _вв: t v— ( вв_список, имя_переменной s с цел_вещ _ дв _точн_выр Е , цел_ вещ. дв _точн _выр _/1> 50 инструкция open: ^-#— OPEN ( — UNIT - ■ идентифи каторжна нала- HRR = метка FILE = текстовое_ выражение - STATUS = текстовое „выражение ACCESS = текстовое _ выражение FORM = текстовое., выражение RECL = целое_выр BLANK = текстовое, выражение— 10STAT = —ч— имя.переменной— т ^— и мя элемента массива - Г 51 инструкция _ctose: CLOSE ( — UNIT = идентификатор., канала ■ ERR = метка STATUS = текстовое,, выражение I0STAT = —г- имя .переменной- х имя элемента массива- -Т»-Ч -^—i
192 52 инструкция Inquire INQUIRE ( FUNIT"= FILE s a идентификатор, канала текстовое^ выражение - ERR = метка IOSTAT = k— EXIST = \— OPENED =• \— NUMBER - NAMED = h- NAME- =' ACCESS = h- SEQUENTIAL: DIRECT = FORM = [— FORMATTED - UNFORMATTED* ■ RECL K- NEXTREC = "BLANK - 1 ■Obi -s/TWJ имя_ переменной ■ имя_ элемента _массива - •>—
1У6 53 инструкцмя_Ьаск$расе : 54 инструкция_епс!т Не: — 55 инструкция_ге\уМ: - • BACKSPACE ENDFILE — • REWIND Е ' идентификатор_канала« - UNI •ERR тп метка - идентификатор_канала *^~~\ тч IOSTAT = -^— имя_переменной- 'Т имя_элемента_массива *^-) (55,54,55) Инструкции BACKSPACE, ENDFILE a REWIND должны содержать идентификатор канала. 56 идентификатор _ка нала: целое_выр имя_переменной имя массива—- -#— имя_элемента_массива • -ф— и мя_ подцепочки -* * (56) Идентификатор канала, отличный от звездочки, должен иметь целый или текстовый тип. 57 идентификатор_формата: метка • имя_переменнои - имя массива текстовое _ выражение * (57) Если идентификатор формата задан в виде имени переменной или имени массива, то он должен иметь целый или текстовый тт.
194 58 ИНструкция_тогта*: FORMAT спецификация., формата • &у спецификация, формата: — ( ~"\ - - ' 60 дескриптор_фмт: я - I \ \ у i дескриптор „•фмт 1 шшя^^шт t na«l/wjnwii» «hlJ4» \ __ ' } •"-*" lw ^-#- .m , A —^ • < 1 — W »i 1 Lw , t J -kP- * 1 * 1 ) < k - Fw.d , -- Ew.d —т , Ч-Ee , i 'h, .. nHh, . > Tc — ' • TLc - * • TRc — > nX — [—•— в—1 f \ ; 1 I •— i 1 * V-Ee-^ . V , .. hn > l_£ ; N 1 L 1 Л. 1 - 1 j I f I 1
195 61 коэф_ловт:. 62 w: 63 е: 64 п: 65 с: 66 d: 67 m:« 68 k: 69 h: 70 - ненулевая^ цел. конст_6ез_ зн - целая _ конст_без_ зн - целая_конст —— литера^ алфавита ункция_ формула: ФУНК1 4—имя_Функции ( -т -имя_переменной ^ч ) s выражение— 71 инструкция_са11: • CALL имя_ подпрограммы выражение - 1 имя массива • имя_процедуры * метка ■. 72 инструкция _ return RETURN u целое_выр (72) Альтернативный возврат в функции не допускается»
196 73 обращение_к_функции: * имя_функции ( -выражение •имя массива- имя_процедуры 74 выражение: — арифметич_выражение — -%— текстовое _ выражение логич_выражение 75 конст_выражение: — арифметич_конст_выражение - •— текстовое _конст_ выражение - —- логич._конст_ выражение — 76 арифметич—выражение : 77 целое_выражение : 78 целое_веществ_дв_точн_ выр: пга / - ** \ ариф_конст_без..знака н- имя_константы - имя_леременной имя „элемента„.массива о6ращение_к_ функции ( арифметич ..выражение') •
197 (76) Имя константы, имя переменной, имя элемента массива или обращение к функции в арифметическом выражении должны быть одного из следующих типов: целый, вещественный, двойной точности или комплексный. В табл. 2 иЗ (6.1.4) перечислены запрещенные комбинации с операндами комплексного типа. (77) Целое выражение-это арифметическое выражение целого типа. (78) Целое., веществ_дв.точн_выр - арифметическое выражение типа целый' вещественный • или двойной точности» арифметич __ конст_ выражение; n:j *. - / - ** арифм_конст_6ез_знака ■ имя _ константы ——- ( а рифметич _конст_ выражение )- (79) Имя константы в арифметическом константном выражении должно быть типа целый, вещественный, с двойной точностью или комплексный. В табл. 2 и 3 (6.14) перечислены запрещенные комбинации с операндами типа комплексный. Правый операнд {показатель) опера-* ции#* должен быть целого типа. целое.конст^выражение: TZ13 -*- • / - >** ■ целая_ноист_6ез_зиака « ямя_нонстанты ■ ( целое _конст_ выражение )-
198 <80) Имя константы в целом константном выражении должно быть целого типа. 81 выр_ граница., индекса': и: * - ■/ - »целая.. константа_без_знака- ■ имя константы ——— • имя_леременной ( выр_граница_индекса) ■ (81) Каждое имя переменной в выражении-границе индекса должна быть целого типа, а переменная эта должна быть формальным параметром или переменной из общего блока. $2 текстовое ..выражение: текстовая „констант а - имя _ константы и мя_ переменной ■ имя_элемента массива - имя,, подцепочки —— • обращением .функции — •С текстовое_выражение )• // (82) В текстовом выражении имя константы, имя переменной, имя элемента массива или обращение к функции должны быть текстового типа». 83 те кетовое; _конст_выражение: . текстовая _константа • имя_ константы —— t ( текстовое _конст_выражение )• // — (83) В текстовом константном-выражении имя константы должно быть текстового типа..
S4 логич„выражение ; Т I ^—.N0T.—J h- .AND. -^ Is— .OR. — •.EQV.-H .NEQY. логич.. константа ■ и мя_ константы — имя. переменной • имя_элемента_массива - обращение.. к_ функции - выражение _ отношения ■ ( логич_выражение ) — (84) В логическом выражении имя константы, имя переменной, имя элемента массива или обращение к функции должны быть логического типа, 85 логич _конст_выражение uu h-.AND. «^ .OR. -J ■.EQV<-^| ■.NEQV логич_константа имя „константы — выражение „отношения - (логич_конст_ выражение ) ■ (85) В логическом константном выражении имя константы должны быть логического типа. Кроме того, каждое простое выражение в выражении отношения должно быть константным еыражением. i_ 66 выражение ^отношения: ^ари<рметич_выражение опер_отнош арисрметич_выражение текстовое., выражение опер_отнош текстовое_выражение (86) Арифметическое выражение комплексного типа допустимо только для операций отношения . EQ." или . NE. 87 опер_ отнош: .LT. — - ЛЕ. — '.EQ. — .NE. — .GT. — ,GE. — 88 имя_элемента_массива > имя _ массива ( г. целое_выражение • ) —
200 89 имя _ под цепочки : tMMfl_nepeMeHHofi ——■ имя _ эл емента.массива с т целое, выражение - гт целое, выражение - 90 имя.константы : — 91 имя ..переменной : — 92 имя .массива:—— 93 имя _ общего .блока : 94 имя.программы : — 95 имя_ подпрограммы_ данных : ■ 96 имя.процедуры: 97 , f имя .подпрограммы: •- 98 * имя_функции : jl - . 99 имя: буква ч цифра L/gW 100 константа: ■знак- •- арифм.конст_6ез_знака - текстовая .конст логич__конст 101 арифм_конст.без.знака : — целая, конст.без.зн — вещ.конст.без.зн — конст_ дв.точн_ без_зн комплексная.конст
201 102 целая„конст..без_зн: 103 ненулевая_цел_конст_без_зн 104 целая_конст : с -г- цифра -ь^ (103) Ненулевая целая константа без знака долтна содержать цифру, отличную от. нуля. 105 eeui_KOHCT.j5e3_3H': { цел ^кон ст_ бе^ зн.- ' • \ ч Цел j K0HCTe6e3._3H- Е целая^конст - 106' конст^дв^точн^без^зн I *• цел_конст_,без_зн - -"1 "- \ v Цел„ конст_беэ_зн- D целая_конст W7 комплексная., конст: t V- знак—' >- ч* вещ_конст_без_зн- знак —' >-целвконст1Ив.безя1.зн- -®-у > 108 логическая., конст: t.TRUC- * .FALSE. L-
202 100 Текстовая ..константа • - кавычка * г литера., не. кавычка • кавычка кавычка — кавычка < 1109) кавычка в текстовой константе представляется в виде двух подряд стоящих кавычек7 не разделенных пробелами* 110 метка: Ь цифра ■ (110) Метка должна содержать цифру, отличную от нуля* 111 литера^ алфавита: ■ кавычка; ' ' 112 | 113 I 114 115 116 литера _не_ кавычка ; знак: ' "Л + - \— цифра: [-— буква: тгптлтп 012345678? ииппи тггггпгггггптпттгггптп ABCDEFGHIJKLMN0PQRSTUVWXYZ muumuimmmuu ТЛТПТф L (111) Пробел является литерой алфавита, В алфавит могут входить также другие литеры.
ОГЛАВЛЕНИЕ Предисловие редактора перевода 5 Предисловие 7 1. Введение 11 1.1. Предмет книги 11 1.1.1. Историческая справка 11 1.1.2. Расширения 11 1.1.3. Разработка нового стандарта Фортрана 12 1.1.4. Расширения, вошедшие в новый стандарт Фортрана .... 12 1.2. План книги 14 1.2.1. Круг читателей 14 1.2.2. Круг вопросов 14 1.2.3. Сравнение старого и нового стандартов 15 1.3. Синтаксические обозначения 15 1.3.1. Расширенная форма Бэкуса 16 1.3.2. Синтаксические диаграммы , 17 1.4. Основные понятия языка Фортран 77 и терминология 19 1.4.1. Последовательность 20 1.4.2. Список 20 1.4.3. Отрезки памяти и единицы памяти 20 1.4.4. Ассоциирование 21 1.4.5. Статус определенности 21 1.4.6. Выбор значения объекта и обращение к процедуре в Фортране 77 22 1.4,7. Процессор 22 2. Характеристика языка Фортран 77 23 2.1. Содержание главы 23 2.2. Алфавит 23 2.2.1. Буквы и цифры 23 2.2.2. Специальные литеры 23 2.2.3. Отношение следования 23 2.2.4. Пробелы 24 2.3. Идентификаторы 25 2.3.1. Имена 25 2.3.2. Ключевые слова 25 2.4. Структура инструкции 25 2.4.1. Строки комментариев 26 2.4.2. Начальная строка 26 2.4.3. Строки продолжения 26 2.4.4. Пустые строки 27 203
2.4.5. Инструкции языка Фортран 77 27 2.4.6. Метки 28 2.4.7. Форма инструкции в Фортране 77 28 2.5. Организация программы 29 2.5.1. Программная компонента 29 2.5.2. Главная программа 29 2.5.3. Подпрограммы 29 2.5.4. Процедуры 30 2.5.5. Программные компоненты BLOCK DATA 30 2.5.6. Исполняемая программа 30 2.5.7. Порядок инструкций в программной компоненте .... 31 3. Типы данных и константы 33 3.1. Типы данных 33 3.2. Константы и значения 35 3.3. Данные целого типа 35 3.4. Вещественные данные 35 3.5. Данные двойной точности 39 3.6. Комплексные данные 40 3.7. Логические данные 41 3.8. Текстовые данные 42 3.3. Холлеритовские данные 43 4. Структуры данных 45 4.1. Переменные -. 45 4.2. Текстовые подцепочки 45 4.2.1. Имя подцепочки 45 4.2.2. Граничные выражения подцепочки 45 4.3. Массивы 47 4.3.1. Имя и тип массива 47 4.3.2. Распределение памяти для массивов 47 4.3.3. Измерения массива 48 4.3.4. Индекс массива 49 4.3.5. Выбор элемента массива 49 5. Выражения 50 5.1. Общий обзор 50 5.2. Арифметические выражения 50 5.2.1. Арифметические операции 50 5.2.2. Арифметические операнды 51 5.2.3. Структура арифметических выражений 52 5.2.4. Арифметические выражения специального вида 55 5.2.5. Правила вычисления арифметических выражений 55 5.2.5.1. Однотипные выражения 55 5.2.5.2. Выражения со смешением типов 56 5.2.5.3. Унарные операции 58 5.2.5.4. Целочисленное деление 58 5.2.5.5. Возведение в степень 58 5.3. Текстовые выражения 58 5.3.1. Текстовые операции 59 5.3.2. Текстовые операнды 59 5.3.3. Структура текстовых выражений 59 5.3.4. Текстовые выражения специального вида 60 5.4. Выражения отношения 60 5.4.1. Операции отношения . 60 5.4.2. Операнды операций отношения 61 5.4.3. Вычисление выражений отношения 61 204
5.4.3.1. Арифметические выражения отношения 62 5.4.3.2. Текстовые выражения отношения 62 5.5. Логические выражения 63 5.5.1. Логические операции 63 5.5.2. Логические операнды 64 5.5.3. Структура логических выражений 64 5.5.4. Логические выражения специального вида 67 5.5.5. Замечание о выполнении логических выражений .... 67 5.6. Интерпретация и вычисление выражений 68 5.6.1. Старшинство операций различных типов 68 5.6.2. Неприкосновенность скобок и правила интерпретации . . 68 5.6.3. Математические соображения 69 5.6.4. Обращения к функциям 70 5.6.5. Вычисление выражений . . . 70 5.6.5.1. Фактические параметры 71 5.6.5.2. Индексы 71 5.6.5.3. Ссылка на подцепочку 71 5.6.5.4. Математическая эквивалентность 71 5.6.5.5. Эквивалентность отношений 71 5.6.5.6. Логическая эквивалентность 72 5.6.5.7. Текстовые выражения 73 6. Выполнение и классификация инструкций Фортрана 74 6.1. Цель классификации 74 6.2. Последовательность выполнения 74 6.2.1. Нормальная последовательность выполнения 74 6.2.2. Передача управления 75 6.2.3. Разные вопросы 75 6.3. Исполняемые и неисполняемые инструкции 75 6.3.1. Список исполняемых инструкций 76 6.3.2. Список неисполняемых инструкций 77 7. Инструкции описания 78 7.1. Общий обзор 78 7.2. Инструкции описания типа 78 7.2.1. Инструкции описания арифметического и логического типа 78 7.2.2. Инструкция описания текстового типа 79 7.2.3. Пояснения об использовании инструкций описания типа . . 81 7.3. Инструкции описания неявного типа имен, описания значений . констант и описания массивов 81 7.3.1. Инструкция IMPLICIT 81 7.3.2. Инструкция PARAMETER 83 7.3.3. Инструкция DIMENSION 84 7.4. Распределение памяти 84 7.4.1. Общая память - 84 7.4.1.1. Статическая и динамическая память 85 7.4.1.2. Типы общей памяти 85 7.4.1.3. Инструкция COMMON 87 7.4.1.4. Организация памяти для общих блоков 88 7.4.2. Эквивалентность памяти 88 7.4.2.1. Инструкция EQUIVALENCE 88 7.4.2.2. Правила использования инструкции EQUIVALENCE 89 7.4.2.3. Эквивалентность и общая память 90 7.4.2.4. Текстовая эквивалентность > 91 7.4.2.5. Эквивалентность массивов 91 7.4.2.6. Частичное совмещение 92 7.4.3. Индексация массивов 93 205
7.5. Инициализация данных 93 7.5.1. Инструкция DATA 94 7.5.2. Неявные DO-списки 95 7.5.3. Программная компонента BLOCK DATA 96 7.6. Инструкции описания, относящиеся к подпрограммам 97 7.6.1. Инструкция EXTERNAL 97 7.6.2. Инструкция SAVE 98 7.6.3. Инструкция INTRINSIC 99 8. Инструкции присваивания 101 8.1. Общий обзор 101 8.2. Арифметическое присваивание 101 8.3. Логическое присваивание 102 8.4. Присваивание литерных цепочек 103 8.5. Инструкция ASSIGN 103 8.6. Разные замечания о присваивании 104 9. Инструкции управления 105 9.1. Общий обзор 105 9.2. Инструкции перехода 105 9.2.1. Инструкция безусловного перехода 105 9.2.2. Инструкция вычисляемого перехода 106 9.2.3. Инструкция перехода по предписанию 106 9.3. Инструкции условного перехода 107 9.3.1. Арифметическая инструкция IF 107 9.3.2. Логическая инструкция IF 107 9.3.3. Конструкция IF-THEN-ELSE 108 9.3.3.1. Уровень инструкции 108 9.3.3.2. Структурная инструкция IF 109 9.3.3.3. Инструкция ELSE IF 109 9.3.3.4. Инструкция ELSE ПО 9.3.3.5. Инструкция END IF 110 9.3.3.6. Замечания и пример ПО 9.4. Инструкция DO Ill 9.4.1. Структура DO-цикла 112 9.4.2. Выполнение DO-цикла 113 9.5. Инструкция CONTINUE 114 9.6. Инструкции STOP и PAUSE 114 9.7. Инструкция END 115 10. Ввод и вывод. Основные понятия 116 10.1. Средства ввода и вывода 116 10.2. Записи 116 10.2.1. Форматные записи 117 10.2.2. Бесформатные записи 117 10.2.3. Запись конца файла 117 10.3. Файлы 117 10.3.1. Внешний файл 118 10.3.2. Внутренний файл 118 10.3.3. Терминология, связанная с файлами 118 10.4. Методы доступа 119 10.4.1. Атрибуты доступа 119 10.4.2. Последовательный доступ 120 10.4.3. Прямой доступ 120 10.4.4. Доступ к внутренним файлам 121 10.5. Каналы 121 10.5.1. Подсоединение 121 10.5.2. Отсоединение 121 206
10.6. Список управляющей информации 122 10.6.1. Синтаксис списка управляющей информации 122 10.6.2. Спецификация канала 123 10.6.3. Спецификация формата 123 10.6.4. Спецификация номера записи 124 10.6.5. Спецификация кода ответа 124 10.6.6. Спецификация возврата по ошибке 124 10.6.7. Спецификация возврата по концу файла 125 10.7. Список ввода-вывода 125 10.7.1. Простой список 125 10.7.1.1. Список ввода 125 10.7.1.2. Список вывода 126 10.7.2. Неявный цикл 126 10.7.3. Массивы 127 10.8. Операции передачи данных 127 10.8.1. Операции бесформатной передачи данных 128 10.8.2. Операции форматной передачи данных 128 10.8.3. Файл печати 129 10.8.4. Ввод и вывод в свободном формате 129 10.8.5. Установка текущей позиции в файле 130 11. Инструкции ввода и вывода 131 11.1. Общая характеристика инструкций ввода и вывода 131 11.2. Инструкции передачи данных 131 11.2.1. Инструкция READ 131 11.2.2. Инструкция WRITE 132 11.2.3. Инструкция PRINT 132 11.3. Вспомогательные инструкции 132 11.3.1. Инструкция OPEN 132 11.3.2. Инструкция CLOSE 135 11.3.3. Инструкция INQUIRE 136 11.4. Инструкции установки текущей позиции в файле 137 11.4.1. Инструкция BACKSPACE 137 11.4.2. Инструкция ENDFILE 137 11.4.3. Инструкция REWIND 141 12. Спецификация формата 142 12.1. Обзор 142 12.2. Способы задания спецификации формата 142 12.2.1. Инструкция FORMAT > 142 12.2.2. Задание формата в виде текстового объекта 143 12.2.3. Структура спецификации формата 143 12.2.4. Редактирование 143 12.3. Дескрипторы преобразования и управляющие дескрипторы редактирования 145 12.3.1. Редактирование числовых данных 145 12.3.1.1. Дескриптор I 146 12.3.1.2. Дескриптор F 147 12.3.1.3. Дескриптор Е 147 12.3.1.4. Дескриптор D 149 12.3.1.5. Редактирование комплексных данных 149 12.3.1.6. Дескриптор G 149 12.3.1.7. Масштабирующий множитель 150 12.3.2. Редактирование логических данных 151 12.3.3. Редактирование текстовых данных 151 12.3.3.1. Дескриптор-цепочка 152 207
12.3.3.2. Дескриптор Н *|2 12.3.3.3. Дескриптор А 152 12.3.4. Установка позиции в записи 153 12.3.4.1. Дескриптор X 153 12.3.4.2. Дескриптор Т 154 12.3.4.3. Дескриптор TL 154 12.3.4.4. Дескриптор TR 154 12.3.5. Дескрипторы управления записями 154 12.3.5.1. Наклонная черта 155 12.3.5.2. Двоеточие 155 12.3.6. Управление выводом знака 155 12.3.6.1. Дескриптор SP 155 12.3.6.2. Дескриптор SS 155 12.3.6.3. Дескриптор S 156 12.3.7. Управление вводом пробелов 156 12.3.7.1. Дескриптор BN 156 12.3.7.2. Дескриптор BZ 156 12.3.8. Разделители в спецификации формата 156 12.3.9. Коэффициент повторения 156 12.3.10. Групповой дескриптор 157 12.4. Ввод-вывод в свободном формате 157 13. Структура программы , 153 13.1. Обзор 158 13.2. Главная программа 158 13.2.1. Инструкция PROGRAM 158 13.2.2. Структура главной программы 160 13.3. Стандартные функции :60 13.3.1. Обращение к стандартной функции 160 13.3.2. Универсальные имена . . . „ 161 13.3.3. Правила выполнения стандартных функций 161 13.4. Функции-формулы 161 13.4.1. Определение функции-формулы 162 13.4.2. Обращение к функции-формуле 163 13.5. Внешние процедуры 163 13.5.1. Виды внешних процедур 164 13.5.2. Выполнение внешней процедуры 164 13.5.3. Инструкция FUNCTION 165 13.5.4. Обращение к внешней функции 166 13.5.5. Инструкция SUBROUTINE 167 13.5.6. Инструкция CALL 168 13.5.7. Инструкция ENTRY 169 13.5.8. Инструкция RETURN 170 13.5.9. Инструкция END 171 13.5.10. Передача массивов в качестве параметров внешних процедур 171 Литература ,. 172 Приложение А. Стандартные функции 173 Приложение В. Синтаксис инструкций Фортрана 179 Приложение С. Синтаксические диаграммы языка 77 181 208