Справочное руководство по языку Fortran 95
Глава 1. Элементы FortranДанныеFortran предлагает программисту различные способы хранения данных и ссылок на них. Можно ссылаться на данные буквально, как в вещественных числах 4.73 и 6.23E5, в целых -3000 и 65536, или в CHARACTER литерале "Continue (y/n)?". Или вы можете хранить и ссылаться на разные переменные данные, используя имена, такие как x или y, DISTANCE_FROM_ORIGIN или USER_NAME. Постоянные, такие как pi или скорость света, могут задаваться именами и постоянными значениями. Можно хранить данные в фиксированного размера области в памяти или отводить для них память, когда программа в этом нуждается. Наконец, Fortran предлагает различные средства создания, хранения и ссылки на структурированные данные с помощью массивов, указателей и производных типов. Встроенные типы данныхПять встроенных типов данных есть INTEGER, REAL, COMPLEX, LOGICAL и CHARACTER. Тип DOUBLE PRECISION доступный в Fortran 77 также поддерживается, но рассматривается как подмножество или разновидность данных типа REAL. Разновидность
В Fortran встроенный тип данных имеет одну или более разновидностей. В LF95
для типов CHARACTER, INTEGER, REAL и LOGICAL параметр разновидности ( число,
используемое при ссылке на разновидность) соответствует количеству байтов,
используемых для представления разновидности. Для данных типа COMPLEX значение
параметра есть количество байтов для представления вещественной или мнимой
части. Имеются две встроенные справочные функции, SELECTED_INT_KIND и
SELECTED_REAL_KIND. Каждая выдает значение параметра разновидности на
основании требуемых диапазона и точности объекта данных в форме, переносимой
на другие Fortran 90 или 95 системы. Разновидности, доступные в LF95,
перечислены в следующей таблице: Таблица 1: Встроенные типы данных
"*" отмечает значения по умолчанию ДлинаКоличество символов в объекте типа CHARACTER указывается его параметром длины типа. Например, CHARACTER литерал "Half Marathon" имеет длину тринадцать. Данные типа LiteralДанные этого типа, называемые также literal, literal constant или непосредственная константа, характеризуются как указано далее для всех типов данных Fortran. Синтаксис литеральных констант определяет их встроенный тип. Литералы INTEGER
Целый литерал состоит из одного или более символов с необязательным
начальным знаком B'10101' Z"1AC3" Литералы REAL
Литерал типа REAL состоит из одной или более цифр и десятичной точки (точка
может появиться перед, после или между цифрами), содержит впереди
необязательный знак Литералы COMPLEX
Литерал COMPLEX формируется заключением в скобки пары разделенных запятой
литералов типа REAL или INTEGER. Первый из REAL или INTEGER литералов
представляет вещественную часть комплексного числа; второй представляет мнимую
часть. Параметр разновидности константы COMPLEX есть 16, если либо
вещественная, либо комплексная часть или обе имеют четверную точность REAL,
или 8, если вещественная или мнимая часть или обе есть REAL двойной точности.
В противном случае параметр разновидности есть 4 (точность по умолчанию для
COMPLEX). Примеры правильных литералов COMPLEX: Литералы типа LOGICAL
Логический литерал есть либо .TRUE. либо .FALSE. с необязательным параметром
разновидности в конце. Если необязательные подчеркивание и параметр
разновидности отсутствуют, литерал имеет разновидность по умолчанию. Примеры
правильных литералов типа LOGICAL есть: Литералы CHARACTER
Такой литерал состоит из цепочки символов, заключенных в соответствующие
кавычки или апострофы, перед ним могут располагаться параметр разновидности и
знак подчеркивания. Именованные данные
Именованные объекты данных, такие как переменные, именованные константы
или результаты функций имеют свойства встроенных или определенных
пользователем типов данных, или неявно (по первой букве имени), или по типу
оператора объявления. Дополнительная информация о именованных объектах
данных, называемая атрибутами объектов данных, может также быть указана или
в операторах объявления типа или в отдельных операторах специально для
атрибутов. Неявное задание типовПри отсутствии операторов объявления типов, тип объекта данных с именем определяется по первой букве его имени. Буквы от I до N означают тип INTEGER, а остальные буквы --- тип REAL. Эти неявные правила могут изменяться или отменяться пользователем с помощью оператора IMPLICIT. Оператор IMPLICIT NONE можно использовать для отмены всех неявных назначений типа в пределах программной единицы (scoping unit). Операторы объявления типаОператоры объявления типа указывают типы, параметры типов и атрибуты именованных объектов данных или функций. Оператор объявления типа можно использовать для каждого встроенного типа INTEGER, REAL (и DOUBLE PRECISION), COMPLEX, LOGICAL или CHARACTER, а также для производных типов (см. "Производные типы" на стр. 16). Атрибуты
Кроме типов и параметров типа, объекты данных или функции могут иметь один
или более следующих атрибутов, которые могут быть указаны в операторах
объявления типов или в отдельных операторах специально для атрибутов:
Подцепочки
Цепочка символов есть последовательность символов в объекте данных типа
CHARACTER. Символы цепочки нумеруются слева направо, начиная с 1.
Сплошная часть цепочки символов, называемая подцепочкой (substring),
может выделяться согласно следующему синтаксису: Массивы
Массив есть множество данных, которые все имеют одинаковый тип и параметры
типа и представляет вектор или прямоугольную матрицу двух и более измерений.
Объект данных, не являющийся массивом, есть скаляр. Массивы объявляются
операторами DIMENSION или операторами объявления типа. Массив имеет ранг,
равный количеству измерений массива; скаляр имеет ранг ноль. Форма массива
определяется его протяженностью по каждому измерению. Размер массива
определяется количеством его элементов. В следующем примере: Ссылки на массив
На массив в целом ссылаются по имени массива. На индивидуальные элементы или
секции массива ссылаются с помощью индексов массива. Элементы массиваЕсли каждый индекс в списке индексов массива есть элементарный индекс, то такая ссылка на массив означает его отдельный элемент. В противном случае это есть ссылка на секцию массива (см. "Секции массива " на стр. 11). Порядок элементов в массиве
Элементы массива образуют последовательность, называемую порядком элементов
массива. Позиция элемента массива в этой последовательности определяется так: Секции массивовМожно ссылаться на некоторую часть массива как на массив. Такие порции называются секциями массивов. Секция массива имеет список индексов, который содержит по крайней мере один индекс, который есть или индекс-триплет или вектор-индекс (см. ниже примеры в "Индексы-триплеты" и "Вектор-индексы"). Заметим, что секция массива только из одного элемента не есть скаляр. Индексы-триплетыТри компоненты индекса-триплета есть соответственно нижняя граница секции массива, верхняя граница и шаг (приращение между последовательными индексами в секции). Любые из них или все три могут отсутствовать. Если опущена нижняя граница, на ее месте предполагается объявленная нижняя граница измерения. Если опущена верхняя граница, предполагается верхняя граница измерения. Если опущен шаг. предполагается шаг 1. Правильные примеры секций массивов с триплетами: a(2:8:2) ! a(2), a(4), a(6), a(8)b(1,3:1:-1) ! b(1,3), b(1,2), b(1,1) c(:,:,:) ! c Вектор-индексы
Вектор-индексы (вектор есть одномерный массив) могут использоваться для
ссылки на секцию всего массива. Рассмотрим следующий пример: Массивы и подцепочки
Секция массива CHARACTER или элемент массива может иметь спецификацию
подцепочки вслед за списком индексов. Если весь массив или его секция имеет
спецификатор подцепочки, то это ссылка на секцию массива. Например: Динамические массивы
Массив может иметь фиксированный размер во время компиляции или может
предполагать определение размеров и формы во время исполнения несколькими
способами:
Размещаемые массивы
Атрибут ALLOCATABLE может быть придан массиву в операторе объявления типа
или в операторе ALLOCATABLE. Размещаемый массив должен быть объявлен со
спецификатором отложенной формы, `:', для каждого измерения. Например: Массивы указателей
Атрибут POINTER может придаваться массиву оператором объявления типа или в
операторе POINTER. Массив указателей, подобно размещаемому массиву,
объявляется с спецификатором отложенной формы, `:', для каждого измерения.
Например: Массивы предполагаемой формы
Массив предполагаемой формы есть фиктивный массив, принимающий форму
соответствующего фиктивного аргумента. Нижняя граница массива с
предполагаемой формой может быть объявлена и может отличаться от
соответствующей границы фактического аргумента-массива. Спецификация
предполагаемой формы есть Массивы предполагаемого размера
Массив предполагаемого размера есть фиктивный массив, размер которого не
известен. Все границы, кроме верхней границы последнего измерения, указаны в
объявлении фиктивного массива. В объявлении верхняя граница последнего
измерения обозначается звездочкой. Оба массива имеют тот же самый начальный
элемент массива и ассоциированы по памяти. Нельзя ссылаться на массив с
предполагаемым размером в контексте, где форма массива должна быть известна,
таком как ссылка на весь массив или во многих встроенных функциях
преобразования массива. Результат функции не может быть массивом
предполагаемого размера. Настраиваемые и автоматические массивы
Можно устанавливать форму массива на основании значений фиктивных аргументов.
Если такой массив есть фиктивный массив, он называется настраиваемым
(adjustable) массивом. Если массив не есть фиктивный массив, он называется
автоматическим массивом. Рассмотрим следующий пример: Конструкторы массивов
Конструктор массива есть массив без имени. Производные типыПроизводные типы есть определяемые пользователем типы данных на основе встроенных типов INTEGER, REAL, COMPLEX, LOGICAL и CHARACTER. В то время как массив есть множество данных одного типа, производный тип может представлять комбинацию встроенных типов и других производных типов. Объект данных производного типа называется структурой. Определение производного типа
Производный тип должен быть определен до объявления объектов этого типа. type coordinates real :: latitude, longitude end type coordinates type place character(len=20) :: name type(coordinates) :: location end type place type link integer :: j type (link), pointer :: next end type linkВ предыдущем примере тип coordinates есть производный тип с двумя компонентами типа REAL: latitude and longitude. Тип place имеет две компоненты: name типа CHARACTER длины двадцать и структуру типа coordinates с именем location. Тип link имеет две компоненты: INTEGER с именем j и структуру типа link, с именем next, которая есть указатель на тот же самый производный тип. Компонента структуры может иметь тот же самый тип, что и сам производный тип только если он имеет атрибут POINTER. Таким способом могут формироваться связные списки, деревья и графы. Есть два пути использования производных типов в более чем одной программной единице. Предпочтительный путь состоит в определении производного типа в модуле (см."Программные единицы модули" на стр.55) и использовать этот модуль там, где нужен производный тип. Другой метод, без модулей, состоит в употреблении оператора SEQUENCE в определении производного типа и в определении производного типа точно тем же способом в каждой программной единице, где этот тип используется. Это можно сделать с помощью файла include. Компоненты производного типа могут быть сделаны недоступными другим программным единицам использованием оператора PRIVATE перед всеми компонентами операторов определений. Объявление переменных производного типа
Переменные производного типа объявляются оператором TYPE. Вот примеры
объявления переменных для каждого из определенных выше производных типов: Ссылки на компоненты
На компоненты структуры ссылаются с помощью оператора `%'. Конструкторы структур
Конструктором структуры называется структура без имени. type mytype ! определение производного типа integer :: i,j character(len=40) :: string end type mytype type (mytype) :: a ! объявление производного типа a = mytype (4, 5.0*2.3, 'abcdefg')В этом примере второе выражение в конструкторе структуры приводится к типу по умолчанию INTEGER при присваивании. УказателиВ Fortran указатель есть псевдоним. Переменная, псевдонимом которой он служит, есть его назначение. Указательные переменные должны иметь атрибут POINTER; переменные назначения должны иметь атрибут или TARGET или POINTER. Ассоциирование Pointer с Target
Указатель может ассоциироваться только с переменной, которая имеет атрибут
TARGET или POINTER. Такая ассоциация может быть осуществлена одним из двух
путей:
Объявление указателей и назначений
Переменная может быть объявлена имеющей атрибут POINTER или TARGET в
операторе объявлении типа, или в операторе POINTER или TARGET. Когда массив
объявляется как указатель, нужно объявлять массив с отложенной формой. integer, pointer :: a, b(:,:) integer, target :: c a => c ! оператор присваивания указателю ! a есть псевдоним для c allocate (b(3,2)) ! оператор allocate ! безымянное назначение для b ! создается в форме (3,2)В этом примере явная ассоциация создается между a и c через оператор присваивания указателю. Заметим, что a была ранее объявлена указателем, c была ранее объявлена назначением, и а и c согласованы в типе, разновидности и ранге. В операторе ALLOCATE целевой массив размещается и b становится указателем на него. Массив b был объявлен с отложенной формой, так что массив назначения мог быть размещен с любой формой ранга два. Выражения
Выражение состоит из операндов, операторов и скобок. Вычисление выражения
производит значение с типом, параметрами типа (разновидность и в случае
CHARACTER длина) и формой. Вот несколько примеров правильных выражений
Fortran: 5 n (n+1)*y "to be" // ' or not to be' // text(1:23) (-b + (b**2-4*a*c)**.5) / (2*a) b%a - a(1:1000:10) sin(a) .le. .5 l .my_binary_operator. r + .my_unary_operator. m
В последнем примере используются определяемые пользователем операции (см.
"Определяемые операции" на стр. 51). Выражения вычисляются в соответствии с правилами приоритета операторов, описанными ниже. Если имеются кратные соседние операции одного приоритета, то вычитания и деления выполняются слева направо, возведения в степень производятся справа налево, а остальные операции могут производиться любым путем в зависимости от оптимизирующих действий компилятора. Скобки могут использоваться для установления нужного порядка действий. Спецификационным выражением называется скалярное выражение типа INTEGER, значение которого можно вычислить при входе в программную единицу во время ее выполнения. Инициализируемым выражением называется выражение, значение которого можно вычислить во время компиляции. Встроенные операции
Перечислим встроенные операции в порядке уменьшения их приоритета: Table 2: Встроенные операции
Замечание: все операции в этой части таблицы имеют одинаковый приоритет Если некая операция произведена над операндами одного типа, результат будет иметь тот же тип и больший из двух параметр разновидности. Если операция произведена над численными операндами разных типов, результат будет иметь высший из типов операндов, причем COMPLEX выше чем REAL, а REAL выше чем INTEGER. Если операция произведена над численными или LOGICAL операндами одинакового типа, но разных разновидностей, результат будет иметь разновидность операнда, имеющего большую точность. Результат конкатенации имеет длину, равную сумме длин операндов. Деление типа INTEGER Результат операции деления INTEGER операндов есть целое, ближайшее к точному отношению операндов в промежутке между нулем и этим отношением. Например, 7/5 вычисляется как 1, а -7/5 --- как -1. Ввод/вывод
В Fortran ввод и вывод производятся на логических устройствах. Устройством
может быть:
Предварительно подключенные устройства ввода/вывода Устройства ввода/вывода 5, 6 и * автоматически подключаются при использовании. Устройство 5 связано со стандартным устройством ввода, обычно клавиатурой, а устройство 6 связано со стандартным выводом, обычно монитором. Устройство * постоянно связано со стандартным вводом и стандартным выводом. Устройства вывода Файлы Fortran рассматривает все физические устройства, такие как файлы на дисках, консоль, принтеры и внутренние файлы как файлы. Файл есть последовательность из нуля или более записей. Формат данных (форматированные или нет), тип доступа (прямой или последовательный) и длина записи определяют структуру файла. Позиция в файле Некоторые операторы ввода/вывода влияют на позицию в пределах внешнего файла. До выполнения оператора передачи данных указанный файл устанавливается на позицию начала записи, указанной спецификатором записи REC= в операторе передачи данных. По умолчанию последовательный файл устанавливается на позицию после последней записанной или прочтенной записи. Но если указан не продвигающий (non-advancing) ввод/вывод с помощью спецификации ADVANCE= , то можно читать или писать определенные записи и читать записи переменной длины с уведомлением об их длине. Оператор ENDFILE записывает признак конца фала после последней прочтенной или записанной записи и устанавливает файл на позицию после конечной записи. Оператор REWIND устанавливает файл в начальную позицию. Оператор BACKSPACE сдвигает позицию файла на одну запись назад. Если обнаружена ошибка, позиция файла не определена. Если ошибок нет и прочтена или записана конечная запись файла, файл устанавливается на позицию после последней записи. В этом случае он должен быть переустановлен перед продолжением чтения или записи операторами REWIND или BACKSPACE. При не продвигающем вводе\выводе некоторой записи, если не было ошибок и не достигнут конец файла, но появился сигнал конца записи, файл устанавливается на позицию после только что прочтенной записи. Если сигнала конца не было, позиция файла не меняется. Типы файлов Тип файла, намеченного для доступа, указывается в операторе OPEN с помощью спецификаторов FORM= и ACCESS= (см."Оператор OPEN" на стр. 181). Форматированный последовательный
Внутренние файлы Всякий внутренний файл есть всегда форматированный последовательный файл и состоит из единственной переменной типа CHARACTER. Если эта переменная имеет значением массив, каждый элемент массива рассматривается как запись в файле. Это свойство допускает конверсию от внутреннего представления (двоичного бесформатного) к внешнему (ASCII, форматированному) без передачи данных на внешнее устройство. Управление кареткой Первый символ форматированной записи, посылаемой на терминальное устройство, такое как консоль или принтер, используется для управления кареткой и не печатается. Остальные символы печатаются в строке, начинающейся с левой крайней позиции. Символы управления кареткой интерпретируются следующим образом: Таблица 3: Управление кареткой
|
<<< | Оглавление | Страницы: 3 4 | >>> |