Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Fortran для персонального компьютера

..pdf
Скачиваний:
22
Добавлен:
15.11.2022
Размер:
12.5 Mб
Скачать

рующей строки); общая длина результирующей строки равна сумме длин строк first и second. Например, строка ’АВ CDE’ является: результатом выражения ’АВ ’ /7 ’CDE’

При конкатенации двух или более строк результиру­ ющая строка имеет такую длину, какие длины объявлены для строковых переменных. Ведущие и "хвостовые" пробелы не отбрасываются.

При конкатенации Си-строк следует помнить, что пус­ той символ (null-символ; \0) автоматически добавляется в ко­ нец каждой Си-строки. Рассмотрим, например, следующее выражение:

’hello ’С I I ’world’С

Оно эквивалентно следующей Си-строке: ’hello \Oworld’ С

Выражения отношения над символьными операндами "сравнивают" позиции операндов с учетом последовательнос­ ти упорядочения, принятой в ASCII. Один операнд считается меньше другого (или "младше"), если он в последовательности упорядочивания указан раньше.

Например, выражение (’apple’ .LT. ’banana’) возвраща­ ет значение .TRUE.; выражение (’Keith’ .GE. ’Susan’) возвра­ щает значение .FALSE. Если сравниваются операнды нерав­ ной длины, то "короткий" операнд расширяется до длины "длинного" операнда путем добавления пробелов справа.

ГЛАВА 2

С Т Р У К Т У Р А П Р О Г Р А М М Ы

2.1Строки

Позиции символов в строках языка ФОРТРАН являют­ ся значащими. Строки формируются из последовательностей символов. Символы интерпретируются по-разному, в зависимости от того, в какой колонке они указаны.

 

Таблица 2.1

Колонка

Интерпретация символа

1-5

Метка оператора. Знак доллара ($) в колонке

 

1 указывает на метакоманду. Звездочка,

 

прописная или строчная буква С в колонке 1

 

указывает на комментарий.

6

Символ продолжения

7-72

Оператор языка ФОРТРАН

73 и выше

Игнорируются

Строки длиной короче 72 символов "догюл няются" про­ белами.

В языке ФОРТРАН используются пять гииов строк:

2.1.1Комментарии

Строка комментария имеет звездочку или прописную или строчную букву С в первой позиции, либо может полно­ стью состоять из пробелов. Знак восклицания, появляющийся как первый непустой символ в строке, также указывает на строку комментария в языке ФОРТРАН. (Строка со знаком восклицания в колонке 6 интерпретируется как строка ком­

ментария).

Строки комментария могут указываться внури операто­ ров, которые имеют строки продолжения. Следует отметить, что отладочные строки, описанные ниже, иногда могут быть обработаны как строки комментария. (См. также Приложение С).

2.1.2Начальные строки

Первая (или единственная) строка оператора языка ФОРТРАН называется "начальной" строкой. Начальная стро­ ка оператора имеет либо пробел либо ноль в колонке о; в колонках 1-5 указывается метка оператора либо пробелы. За исключением оператора, следующего за логическим IF, все операторы ФОРТРАНа начинаются с такой строки.

2.1.3Строки продолжения

Строка продолжения гшедставляет собой строку, имею­ щую пробелы в колонках 1-5 и символ (отличный от пробела или нуля) в колонке 6. Строка продолжения увеличивает раз­ мер "участка”, в который записывается оператор. Оператор может быть расширен для включения такого количества строк продолжения, сколько позволит доступная для использования область памяти. Если установлена метакоманда $STRICT, то в том случае, если используется более 19 строк продолжения, будет выдано предупреждение.

2.1.4Метакоманды

В первой позиции строки метакоманды присутствует знак доллара ($). Метакоманда управляет работой компилято­ ра языка ФОРТРАН.

$DEBUG:\pdq’ SDECLARE

$LINESIZE:132

2.1.5Отладочные строки

Отладочные строки содержат любые прописные или строчные буквенные символы, за исключением С и с в позиции 1. Если метакоманда $DEBUG специфицирует символ, нахо­ дящийся в позиции 1 отладочной строки, то этот символ обра­ батывается как символ пробела и строка компилируется как и любая другая строка. Если метакоманда $DEBUG не специфицирует символ в первой колонке, то строка обрабаты­ вается как строка комментария.

2.2Представление исходного кода

в"свободном формате”

Пользователь может вводить свой исходный код в "сво­ бодном формате", используя для этого метакоманду $FREEFOK.M; при этом большинство ограничений, наклады­ ваемых форматом языка ФОРТРАН, не используются. Боль­ шинство правил, изложенных в подразд. 2.1, не применимы к исходному коду в "свободном формате". Необходимо придер­ живаться следующих правил:

—двойной апостроф в колонке 1 или знак восклицания, заданный как перыи символ в строке, указывают на строку

комментария; —начальные строки могут начинаться в любой колонке

(позиции); —начальные строки могут начинаться с операторной мет­

ки, длиной от 1 до э цифр (пробелы игнорируются). Для отде­ ления операторной метки от первого символа оператора ука­ зывать пробел не требуется; первый непустой непробельный символ есть начало оператора;

—если последний ненулевой символ в строке является зна­ ком минус, то он отбрасывается и следующая строка принима­

ется как строка гуюдолжения. Строка продолжения может на­

чинаться в любой позиции; —буквенные символы и звездочк-и недопустимы в качестве

маркеров комментария в позиции 1.

2.3Последовательность операторов

иметакоманд

Операторы описывают, специфицируют и классифици­ руют элементы программы пользователя как действия, кото­ рые эта программа должна выполнять. Операторы языка ФОР­ ТРАН описаны в главе 4 "Операторы”. Стандарт ANSI языка ФОРТРАН задает определенную последовательность специ­ фикации и исполнения операторов и строк, образующих мо­ дуль ФОРТРАН-программы. Некоторые расширения языка ФОРТРАН данной версии требуют удовлетворения дополни­ тельным требованиям. В Табл 1.2 показано, какие операторы и метакоманды должны предшествовать, а какие следовать за любым оператором или метакомандой.

2.4Параметры

"Параметрами" являются значения, которые "переда­ ются в" или "передаются из" функций и процедур. Формаль­ ным параметром является имя, по которому параметр ’узна­ ется" внутри функции или процедуры. Фактический параметр представляет собой специфическую переменную, выражение, массив, имя функции или другой элемент, передаваемый в процедуру или функцию при вызове.

Количество фактических параметров должно совпадать с количеством формальных параметров (если, однако, не задан атрибут VARYING) и должны быть согласованы соответству­ ющие типы параметров.

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

Если процедура или функция описаны раньше, чем они использовались в первый раз, или если используется оператор INTERFACE ТО, то компилятор будет выполнять проверку корректности количества и типов параметров. В противном случае, компилятор использует параметры, заданные при пер­

вом использовании процедуры или функции для определения их количества и типов.

Следует отметить, что компилятор способен определить несоответствие типов фактических и формальных параметров

только в том случае, если известен тип формального парамет­ ра.

В общем случае значения параметров передаются в или из процедуры или функции по ссылке (указателю); т.е. они передают адрес памяти параметра. В языке ФОРТРАН фирмы Microsoft это принято по умолчанию.Для передачи параметра

по значению следует использовать атрибут VALUE (см. подразд.1.5.11).

Таблица 2.2 Порядок следования операторов

$D066, $ [NO ]FLOATCALLS, $[NO 1FREEF0RM, SSTORAGE

BLOCK DATA, FUNCTION, INTERFACE, PROGRAMM, SUBROUTINE

 

IMPLICIT

 

 

COMMON,

 

 

DIMENSION,

 

$[NOT ]

EQUIVALENCE,

 

LARGE

EXTERNAL,

PARA

без

INTRINSIC,

SAVE,

METERI

пара­

 

ENTRY

метров

 

Операторы описания типа,

 

TOR-

$[NOT JLARGEc

MAT

параметрами

 

Операторные

 

функции

DATA

Исполняемые

 

операторы

END

 

$[N01DEBUG $ [N 0 1DECLARE $DEFINE

$IF

$ELSE

$ELSEIF

$ENDIF

$INCLUDE

LINESIZE

NOJLIST umMOlLOOPOPT $MESSAGE $PAGE $PAGESIZE $fN01STRICT ^SUBTITLE

$TITLE

$PACK

$[NO JTRUNCATE

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

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

Если фактическим параметром является выражение, оно вычисляется непосредственно перед установлением вза­ имосвязи между формальным и фактическим параметром.

Если фактический параметр является элементом мас­ сива, то его индексные выражения также вычисляются непос­ редственно перед установлением указанной взаимосвязи. Ин­ дексные выражения остаются без изменения в процессе

исполнения процедуры или функции, даже если они содержат переменные, которые во время исполнения процедуры или

функции переопределяются.

Количество и размер измерений в формальном парамет­ ре может отличаться от указанных в фактическом параметре, однако, любая ссылка на формальный массив 'должна нахо­ диться в пределах", указанных для фактического массива. Следует отметить, что ссылка на элемент, находящийся вне указанных границ не будет классифицироваться как ошибка: результат в этом случае будет непредсказуем.

Если формальным параметром является переменная, а фактическим — массив, то каждый элемент массива передает­ ся в процедуру "по-элементно", и процедура исполняется од­ нократно для каждого элемента. Эта процедура должна быть объявлена в операторе INTERFACE ТО, либо должна быть встроенной функцией, если массив передается в скалярный формальный параметр.

При передаче целочисленных параметров по ссылке следует отметить, что переменная типа INTEGER*2 не может быть передана в формальный параметр типа INTEGER*4, а переменная INTEGER*4 не может быть передана в формальный параметр INTEGER*2. Преобразование типов данных мо­ жет быть реализовано с использованием встроенных функций INT4 или INT2 (см. главу 5), однако результатом в этом слу­ чае будет выражение и процедура не сможет выполнить присвоение значения параметру.

Кроме того, следует отметить, что когда задана метако­ манда $STORAGE:4 (принимается по умолчанию), то даже выражения, в которых используются только параметры INTEGER*!, будут выдавать результат с типом INTEGERS.

Следующая программа, например, в качестве результата вы­ дает ошибку:

$STORAGE:4 INTEGER*2 i, k CALL Subr(j + k)

SUBROUTINE Subr (n) INTEGER*2 n

Ошибочный результат получается в виду того, что ре­ зультат выражения j + к имеет тип INTEGERS. Вызов проце­ дуры должен быть записан следующим образом:

CALL Subr (INT2(j + k))'

Целочисленные параметры, передаваемые по значени- ю, под действие данного ограничения не попадают. Правил;! преобразования для значений параметров совпадают с пра вилами преобразований, принятыми при выполнении опера­ ции присваивания. Например, можно передать вещественное

значение в целочисленный параметр, т.к. преобразование вы­ полняется автоматически.

2.5Программные модули

Компилятор языка ФОРТРАН обабатывает программ­ ные модули. Программный модуль может быть головной прог­ раммой, процедурой, функцией, подпрограммой (модулем) блока данных. Любой из них может быть скомпилирован отдельно и затем они могут быть скомпонованы вместе. В сле­ дующем списке перечислены четыре типа программных моду­ лей

1. Головная программа. Любой программный модуль, пер­ вым оператором которого не являются операторы FUNCTION, SUBROUTINE или BLOCK DATA. Головная программа в ка­ честве первого оператора имеет оператор PROGRAM, но это не обязательно.

2. Процедура. Программный модуль, который может быть вызван из другого программного модуля при помощи операто­ ра CALL.

3.Подпрограмма блока-данных. Программный модуль, обеспечивающий назначение начальных значений для пере­ менных в поименованном "общем” блоке.

4.Функция. Программный модуль, на который можно ссы­ латься из выражения.

PROGRAM, SUBROUTINE, BLOCK DATA, FUNCTION и операторы операторной функции детально опи­

саны в разд.4.1

ГЛАВА 3.

СИСТЕМА ВВОДА/ВЫВОДА

Вданном разделе рассматривается система ввода/вывода, реализованная в языке MS Fortran-5.0. В разделе описыва­ ются типы файлов и перечислены операторы, использующиеся для обработки данных. В дополнительных подразделах описа­ ны разрешенные параметры (опции) операторов ввода/вывода и использование символов управления кареткой, формати­ рования ввода/вывода и дескрипторов редактирования. Расс­ матриваются также ввод/вывод, управляемый списком и ввод/вывод, управляемый именованным списком.

3.1Общие сведения о системе ввода / вывода

В системе ввода/вывода языка ФОРТРАН данные сох­ раняются в файлах и могут передаваться между файлами. Раз­ личают два основных типа файлов:

—Внешние файлы. Устройство, например экран, клави­ атура или принтер; либо файл, сохраняемый на устройстве, например файл на диске;

—Внутренние файлы. Символьная подстрока, символьная переменная, элемент символьного массива, символьный мас­ сив, элемент символьной структуры или несимвольный массив (см. также разд.3.5).

3.2Операторы ввода/вывода

Операторы ввода/вывода языка ФОРТРАН обеспечива­ ют передачу и преобразование данных, обработку файлов, определение или описание возможностей взаимосвязей файлов. Операторы ввода вывода перечислены в Табл.3.1.

ПРИМЕЧАНИЕ Кроме операторов ввода/вывода в языке ФОРТРАН

присутствуют встроенные функции ввода/вывода, а именно: функция EOF(), описанная в подразд.5.2.13. Встроенная функция EOFO возвращает, в качестве значения результата, логическое значение, которое указывает на то, остались ли в

файле данные после данной позиции (т.е. позиции конца фай­ ла).

Четырнадцать параметров операторов ввода/вывода ис­ пользуются более чем в одном операторе ввода/вывода: они

рассмотрены в Табл.3.2. Их полное описание приведено в под­ разделах 3.2.1-3.2.12.

3.2.1Имена файлов (параметр FILE=)

Файл может иметь имя. Имена файлов должны удовлет­ ворять правилам, перечисленным в подразд.1.1.

Имя внутреннего файла есть имя символьной подстро­ ки, символьной переменной, элемента символьной структуры,

Таблица 3.1 Операторы ввода/вывода

Оператор

Функция

BACKSPACEПозиционирование файла назад на одну запись

CLOSE

 

"Отключает" устройство

 

ENDFILE

Вывод записи "конец файла" во внешний файл

INQUIRE

Получение информации о характеристиках и

 

текущем состоянии указанного внешнего

 

 

файла или устройства

 

LOCKING

Управление доступом к информации специфи­

 

ческих файлов прямого доступа и/или записей

OPEN

Ассоциирование номера устройства с конкрет­

 

 

ным файлом

 

PRINT

Вывод данных на устройство, отмеченное

 

 

звездочкой (*)

 

READ

 

Ввод данных

 

REWIND

Репозиционирование файла в его начальную

WRITE

 

позицию

 

 

Вывод данных

 

 

Таблица 3.2

 

Параметр

Операторы ввода/вывода

Под-

 

 

 

разд

ACCESS=<access>

INQUIRE, OPEN

3.2.3

BLOCKSIZE=<blocksize>

INQUIRE, OPEN

3.2.4

<editlist>

FORMAT, PRINT

3.2.5

 

 

READ,WRITE

3.2.6

ERR=<errlabel>

Все, за исключением PRINT

END=<endlabel>

Все, за исключением PRINT

3.2.6

FILE=<file>

INQUIRE, OPEN

3.2.1

[FMT= ]<formatspec>

PRINT, READ,WRITE

3.2.7

FORM=<form>

INQUIRE, OPEN

3.2.9

<iolist>

PRINT, READ,WRITE

3.2.10

IOSTAT=<iocheck>

Все, за исключением PRINT

3.2.6

MODE=<mode>

INQUIRE, OPEN

3.2.11

NML=<nmIspec>

PRINT, READ,WRITE

3.2.8

REC=<rec>

LOCKING, READ,WRITE

3.2.12

SHARE=<share>

INQUIRE, OPEN

3.2.11

[UNIT= ]<unitspec>

Все, за исключением PRINT

3.2.2

элемента символьного массива, символьного массива или не­ символьного массива, образующего файл.

Имя внешнего файла есть строка символов, тождествен­ ная имени, под которым файл известен для операционной сис­ темы. (Следует помнить, что некоторые операционные систе­ мы, в частности MS DOS, "безразличны к регистру букв", используемых в имени). Операционная система "предполага­ ет", что файл находится в текущем рабочем каталоге, если пользователь не указал путь. Имена внешних файлов должны удовлетворять соглашениям.об именовании файлов, приня­ тым в используемой пользователем операционной системе.

Внешний файл может быть связан с номером модуля на языке ФОРТРАН одним из следующих способов:

—если файл открывается с использованием оператора OPEN, то имя файла может быть указано в операторе OPEN; —если файл открыт при помощи оператора OPEN для уст­ ройства, отличного от заранее присоединенных устройств (с номерами 0, 5 и 6) и в нем не указано имя файла, то файл рассматривается как рабочий или временный файл; в этом

случае используется имя, принимаемое по умолчанию; —если файл открыт при помощи оператора OPEN и в нем

специфицировано "пустое" имя файла (т.е. оно состоит из од­ них пробелов), то имя может быть взято из командной строки или назначено пользователем (см. подразд.4.6.1);

—если в операторах READ или WRITE имеется ссылка (обращение) на файл, который в данный момент еще не от­ крыт, то выполняется неявная операция открытия файла (см. подразд.4.6.1). Неявная операция открытия файла эквивален­ тна исполнению оператора OPEN с именем, специфицирован­ ным как "пустое" имя. Поэтому имя считывается из командной строки или может быть введено пользователем

3.2.2Устройства (параметр UNIT=)

Для большинства операций ввода/вывода файл должен быть идентифицирован спецификатором устройства. Специ­ фикатор устройства внутреннего файла является тем же са­ мым, что и имя этого внутреннего файла (см. подразд.3.5).Для внешнего файла пользователь может присоединить файл к некоторому спецификатору устройства при помощи оператора

Внешние устройства, которые пользователь "присоеди­ нил" к файлам, будут "отсоединяться" при завершении (Нор­ мальном или аварийном) исполнения программы, либо когда ^ст^ойство "будет отсоединено" при помощи оператора

Спецификатор устройства необходим для всех операто­ ров ввода/ вывода за исключением оператора PRINT (посколь­ ку при этом вывод всегда назначается на стандартное устрой­ ство), оператора READ, указываемого только со спецификатором формата и списком ввода/вывода, оператора INQUIRE (т.к. при этом специфицируется имя файла, а нс устройство, с которым ассоциируется файл).