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

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

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

CHARACTERSO city CHARACTERS state INTEGERS zip INTEGER*4 telephone INTEGERS date_of_birth INTEGERS date of_hire

INTEGERS sociaT_security(3) LOGICALS married

INTEGERS dependents ENDSTRUCTURE

Спецификация структуры не является переменной, но имеет тип переменной. Структурные переменные определя­ ются оператором RECORD. Для группы в 200 работающих следующий оператор будет описывать массив структурных переменных для получения сведений о датах поступления на работу, используя указанное ранее описание структуры:

RECORD /employee_data7 employees(200)

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

employees(99).dependents. Первая буква имени штата, где живет работник, задается следующей строкой: employees(99).state (1:1). Следует отметить, что тип данных ссылки структуры есть тип элемента, на который делается ссылка. В двух приведенных в данном подразделе примерах первая ссылка имеет тип INTEGERS. Вторая ссылка имеет тип CHARACTERS.

Поскольку для разделения структурных элементов ис­ пользуются точки, элемент не может иметь имя отношения или логического оператора (NOT, AND, OR, GE, EQ и т.д.). Если имя оператора отношения или логического оператора используется, то компилятор будет пытаться интерпретиро­ вать имя как оператор отношения.

ПРИМЕР

Описание структуры может содержать объявления структурных переменных. Например, имена работников и их адреса описываются как отдельные структурные типы:

STRUCTURE /employee name/ CHARACTERS5 fast name CHARACTER-45 first" name

END STRUCTURE STRUCTURE / employee_addr/

CHARACTERSO street name INTEGERS street_number

INTEGERS apt number CHARACTERS!) city

CHARACTERS state INTEGERS zip

END STRUCTURE

Следующие переменные становятся структурными пе­ ременными внутри структуры employee_data:

STRUCTURE /employee data/

RECORD /employee_name/ name RECORD / employee_addr/ addr INTEGERS telephone INTEGERS date of birth INTEGERS date“oOiire INTEGER*2 sociaI_security (3)

LOGICAL*2 married INTEGER*2 dependents

END STRUCTURE

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

дены в подразд. 4.2.

1.4Новые возможности работы с массивами.

Допустимое количество элементов массива и числа его измерении ограничено только объемом допустимой памяти, которая может быть использована при работе. Если, однако, специфицирована метакоманда $STRICT, то при использо­ вании массивов, имеющих более 7 измерений, будет выдана ошибка (предупрежедение). Для ссылки на элемент массива следует использовать следующий синтаксис:

array (<index>),

гдеarray - есть имя массива. Если в операторе типа тип массива не объявлен, то элементы массива будут иметь тип, определя­ емый по цервой букве имени массива;

index — индексное выражение (выражения). Если вданном случае указано более одного индексного выражения, они дол­ жны быть разделены запятыми. Каждый индекс должен быть арифметическим выражением. Результат выражения преоб­ разуется к целочисленному значению путем округления. Если специфицирована метакоманда $STRICT, то каждый индекс должен быть целочисленным выражением. Допустимы указа­ тели функций и указатели элементов массива. Значение индекса может быть положительным, отрицательным или рав­ ным 0.

В языке ФОРТРАН фирмы Microsoft область хранения массива может быть размещена динамически, т.е. размер каж­ дого измерения может устанавливаться на этапе исполнения, а не во время компиляции. Это делается для "размещаемых*

массивов. Для любого размещаемого массива необходимо, что­ бы он был объявлен с атрибутом ALLOCATABLE и было задано число его измерений. При исполнении программы оператор ALLOCATE устанавливает размер каждого измерения. После использования массива оператор DEALLOCATE возвращает область памяти, которую занимал массив, в общий Пул. В следующем примере показано корректное использование

атрибута ALLOCATABLE и операторов ALLOCATE и DEALLOCATE’

INTEGER dataset [ALLOCATABLE ](:,:,:) INTEGER reactor, level, points, error DATA, reactor, level, points / 10,50, 100 /

ALLOCATE (dataset(reactor,level,points), STAT-error)

DEALLOCATE (dataset, STAT - error)

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

.AND. или .GE. и др. Массивы также могут передаваться в функции (как встроенные, так и внешние).

Когда два или более массивных операндов указываются в операторе присваивания или выражении, они все должны "согласовываться". Другими словами, они должны иметь оди­ наковое количество размерностей, а сответствующие размер­ ности должны иметь одинаковый размер и одинаковые верх­ нюю и нижнюю границы. Например, массивы first(6,3) и second(3,2,3) не согласуются. Хотя в памяти они и занимают одинаковые области, их размерности не соответствуют. Мас­ сивы third(3,4) и fourth(-1:1,5:8) также не согласовываются. Они имеют одинаковое число размерностей, каждая из кото­ рых, однако, имеет свой собственный размер. Настраиваемые и размещаемые массивы не согласуются; они не могут срав­ ниваться в выражениях, даже если их размерности совпадают.

Все операции, разрешенные для скалярных аргументов, разрешены для аргументов типа массивов. Любое массивное выражение может быть правой частью оператора присваива­ ния, левая часть которого есть массив. Массивные выражения могут появляться только в операторах присваивания и в каче­ стве аргументов функций.

Всевстроенные функции, имеющие скалярные аргумен­ ты, могут также принимать массивные аргументы. Если поль­ зователь предполагает передать аргументы во внешнюю функцию, принимающую скалярные аргументы, он должен объявить внешнюю функцию в операторе INTERFACE. Ни один из формальных аргументов функции не может быть мас­ сивом.

ПРИМЕЧАНИЕ При обработке массивных выражений компилятор мо­

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

1.5.2Атрибут ALIAS

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

СИНТАКСИС

ALIAS: g

где g — есть символьная константа (может быть Си-строкой; см. подразд.1.2.1.1)* никакие преобразования над константой g не выполняются. Например, строчные буквы не преобразу­ ются в прописные (и наоборот). Такая возможность особенно полезна при установлении интерфейса с языками, в которых регистр букв является значащим (например, с языком Си).

Для ссылок на подпрограмму, входящую в состав того же исходного файла, допустимо использование только имени, специфицированного в объявлении подпрограммы. Для ссы­ лок на подпрограмму, ’’находящуюся вне исходного файла”, допустимо использование только самого имени. Пользователь также может использовать атрибут ALIAS в операторе INTERFACE для переопределения имени подгуюграммы в другом исходном файле, которую пользователь собирается вы­ звать.

Атрибут ALIAS отменяет атрибут С. Если атрибут С используется в подпрограмме вместе с атрибутом ALIAS, под­ программа будет использовать соглашения о вызовах, приня­ тые в языке Си; соглашения об именовании, принятые в языке Си, однако, использоваться не будут.

Атрибут ALIAS не может быть использован для фор­ мальных параметров.

ПРИМЕР

Данный оператор SUBROUTINE задает подпрограмме PasSub имя OtherName вне данного исходного файла.

SUBROUTINE PasSub [ALIAS:’OtherNameT]

1.5.3Атрибуте

lf Атрибут С может быть применен для подпрограмм, ’’об­ щих” блоков и типов. В случае подпрограммы атрибут С опре­ деляет, что подпрограмма удовлетворяет тем же соглашениям о вызовах, которы приняты для Си-процедур. Однако следует учитывать различия между соглашениями о вызовах языка ФОРТРАН и соглашениями, принятыми в языке Си:

—Последовательность, в которой параметры помещаются

встек: В языке ФОРТРАН параметры помещаются в стек в той

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

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

—Размещение кода, который восстанавливает стек при за­ вершении исполнения процедуры: В языке ФОРТРАН этот код указывается в вызываемой процедуре. При этом при получа­

ется код меньший, чем в языке Си, где код следует ("указыва­

ется”) сразу за вызовом процедуры.

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

для подпрограмм, для которых также указан атрибут С)- Используя атрибут С. имена подпрограмм автомати­

чески модифицируются, чтобы сделать их проще для сопостав­ ления с используемыми в языке Си соглашениями об именах. Внешние имена преобразуются к виду ’’строчных букв" и на­ чинаются с символа подчеркивания (_).

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

В случае использования атрибута С для значении типа INTEGER" этот тип рассматривается как целочисленный язы­ ка Си. Размеры целочисленных типов данных, принимаемые

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

вязыке ФОРТРАН по умолчанию для целых принимается длина, равная 32 разрядам, тогда как длина целого в языке Си составляет в этом случае 16 разрядов. Таким образом, если пользователь компилирует свою программу для конкретного процессора, он может использовать атрибут С для целочислен­ ных переменных, которые предполагается передавать между программами на языках ФОРТРАН и Си, чтобы обеспечить

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

Атрибут С не может быть использован для формальных параметров, за исключением случая, когда он применяется для типа INTEGER, например: INTEGER [С Jargument

Атрибут ALIAS отменяет атрибут С.

1.5.4Атрибут EXTERN

Атрибут EXTERN может быть использован в объявле­ ниях переменных. Он указывает, что переменная размещается в другом исходном файле. Атрибут EXTERN должен исполь­ зоваться тогда, когда переменные, к которым выполняется доступ, объявлены в подпрограммах на других языках прог­

раммирования, и не должен использоваться для формальных параметров.

1.5.5Атрибут FAR

Атрибут FAR, когда он используется с формальными параметрами, специфицирует, что параметр будет переда­ ваться с использованием сегментированных адресов. При ис­ пользовании атрибута FAR с переменными, он специфици­ рует, что переменная размещается в "удаленных” областях данных (в памяти).

1.5.6Атрибут HUGE

Использование атрибута HUGE является наиболее удобным способом спецификации того, что формальный пара­ метр или "размещаемый" массив могут "занимать" более одно­ го сегмента (64К).

Компилятор не обеспечивает гарантий того, что атрибут HUGE специфицируется для всех параметров, "занимающих" более одного сегмента в памяти. Компилятор языка ПАСКАЛЬ версии 3.3 и ниже и компилятор языка Си версии 3.0 и ниже не поддерживают параметры с атрибутом HUuE.

1.5.7Атрибут LOADDS

Атрибут LOADDS применяется только для раздельно компилируемых подпрограмм и функций. Он предписывает компилятору создавать сегмент данных для данных внутри этой процедуры; базовый адрес (DGROUP) новых сегментов данных автоматически загружается в регистр DS при вызове процедуры. Использование раздельного сегмента данных поз­ воляет данным процедуры вызываться при помощи 16-и раз­ рядных ссылок типа NEAR, а не при помощи 32-х разрядных ссылок типа FAR. При этом скорость доступа к данным уве­ личивается. Сегмент данных для программ, принимаемый по умолчанию, автоматически перезагружается во время преры­ вания исполнения процедуры. Атрибут LOADDS применяется в основном для процедур, написанных пользователем, кото­ рые включаются в динамическую библиотеку компоновщика для системы OS/2 (DLL). Он не является необходимым для процедур, исполняемых в программах DOS, поскольку опция /ND командной строки FL (именование сегмента данных) ав­ томатически предполагает, что базовый адрес нового сегмента данных уже загружен.

1.5.8Атрибут NEAR

Атрибут NEAR специфицирует, что фактический пара­ метр находится в "сегменте данных, принимаемом по умол­ чанию" и что в подпрограмму передается только его смещение. Данный атрибут может также использоваться с блоками обще­ го пользования. Блоки общего пользования, имеющие атрибут NEAR, отображаются в сегмент данных, принимаемый по

умолчанию.

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

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

зует сегментированные адреса.

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

В параметры, определенные с типом NEAR, нельзя пе­ редавать:

— данные из "общих" блоков, которые не специфицирова­ ны с атрибутом NEAR;

—массивы, специфицированные с атрибутом HUGE; —массивы, определенные в тот момент, когда используется

метакоманда $LARGE;

—переменные, поименованные в метакоманде $LARGE.

1.5.9Атрибут PASCAL

Атрибут PASCAL может быть использован с подпрог­ раммами, "общими" блоками и формальными параметрами в текущей подпрограмме. Атрибут PASCAL не может использо­ ваться для формальных параметров в списке формальных па­ раметров. Данный атрибут идентифицирует параметр или подпрограмму, как имеющие характеристики языка ПАС-

—аргумент или параметры подпрограммы передаются по значению (если, однако, не указан атрибут REFERENCE);

—по прежнему используются соглашения о вызовах, при­ нятые в языке ФОРТРАН.

1.5.10Атрибут REFERENCE

Атрибут REFERENCE может использоваться только для формальных параметров. Он указывает на то, что передача параметров выполняется по ссылке, а не по значению.

1.5.11Атрибут VALUE

Атрибут VALUE может использоваться только для фор­ мальных параметров. Он указывает на то, что параметр пере­ дается по значению.

Если в описании подпрограммы указаны либо атрибут С, либо атрибут PASCAL, то все параметры рассматриваются как имеющие атрибут VALUE, поскольку языки Си и ПАС­ КАЛЬ в общем случае осуществляют передачу параметров по значению.

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

Элементы, передаваемые в параметры с атрибутом VALUE, могут отличаться по типам. Если необходимо преоб­ разование типов, то оно выполняется непосредственно перед вызовом (обращением) и удовлетворяет правилам, рассмот­ ренным в подразд. 1.6 ”Преобразование типов арифметических операндов".

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

В языке Си массивы никогда не передаются по значе­ нию. Если пользователь указал атрибут Сив его подпрограмме присутствует параметр типа массива, то массив будет переда­ ваться так, как если бы он являлся структурой данных языка Си (struct). Для передачи массива и обработки его как массива (а не как структуры struct), пользователь должен выполнить следующее:

—либо использовать для формального параметра атрибут REFERENCE;

—либо передать результат, возвращаемый функцией LOC, LOCNEAR или LOCFAR по значению.

1.5.12Атрибут VARYING

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

ров не определено. Такие фактические параметры рассмат­ риваются как передаваемые по значению; автоматическое преобразование типов данных не выполняется.

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

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

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

1.6Преобразование типов арифметических

операндов

Когда все операнды арифметического выражения имеют один и тот же тип, то значение, возвращаемое выражением, имеет тот же тип. Если операнды определены с различными типами, то возвращаемое выражением значение имеет тип операнда наивысшего ранга. Исключением из правила явля­ ются операции, включающие числа типа REAL*8, и числа типа COMPLEX*8, возвращающие результаты с типом COMPLEX* 16. Арифметические операнды ранжированы сле­

дующим образом:

—DOUBLE COMPLEX или COMPLEX*16 (наивысший

ранг)

—COMPLEX [*8]

—REAL*8 или DOUBLE PRECISION —REAL[*4]

—INTEGERS

—INTEGER*2 —IMTEGER*1 (низший ранг)

Например, если операция выполняется над операндом

типа INTEGER*2 и операндом типа REAL*4, то сначала INTEGER*2 преобразуется к REAL*4. Результат операции также имеет тип REAL*4. Подобным же образом, если выпол­ няется операция над вещественным числом и комплексным числом, то сначала вещественное число преобразуется к ком­ плексному виду и результат операции также будет иметь тип комплексный.

Для выражений с целочисленными операндами следует отметить, что результат имеет размерность операнда с максимальной размерностью. Например, если переменные j и к объявлены как INTEGER*2 (и при этом не установлена ме­ такоманда $STORAGE:2), то результат выражения j+k имеет тип 1NTEGER*4. (Аналогичный результат имеет место, если метакоманда $STORAGE опущена, поскольку по умолчанию для метакоманды $STORAGE устанавливается значение 4).

Следует также отметить, что обычно при выполнении процедуры оптимизации компилятор ’’удаляет арифметику с высокой точностью”, если, однако, это не оказывает влияние на конечный результат и если не установлена метакоманда $DEBUG.

Использование метакоманды $STORAGE:4 ”не оказы­ вает влияния” на выражения над операндами, которые опреде­ лены с типом INTEGER*2, имеющие только операции плюс (+), минус (-) или умножение (*). Результаты будут тождест­ венны, поскольку преобразование к типу INTEO E!R *4 проме­ жуточного результата не предохраняет от переполнения при выполнении арифметических операций на числами типа INTEGER*2. Следует отметить, что сообщения о таких "пере­ полнениях” не выдаются, если, однако, метакоманда $DEBUG не является действительной.

1.7Символьные выражения

Результатом символьного выражения является значе­ ние, имеющее символьный тип . В символьных выражениях используются шесть основных операндов:

1.символьные константы;

2.указатели символьных переменных;

3.указатели элементов символьных массивов;

4.указатели символьных функций;

5.символьные подстроки;

6.указатели символьных элементов структуры.

Вданном случае имеется только один символьный опе­ ратор: оператор конкатенации (//). Оператор используется следующим образом:

sum = first / / second

Вмрезультате получается символьная строка, значением которой является значение first (начало результирующей строки), объединенное со значением second (хвост” результи­