1227
.pdfCHARACTERSO 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 (хвост” результи