
- •Управление векторами и матрицами
- •Компиляция и выполнение Компиляция
- •Связывание (редактирование связей )
- •Выполнение
- •Примеры
- •Соглашения о записи кода
- •Арифметические выражения
- •Операции отношения
- •Логические выражения
- •Сравнение символов
- •Переносимость результата
- •Спецификация массивов
- •Сечения массива Индивидуальные элементы
- •Сечения
- •Векторные указатели
- •Память для массива Физическая память:
- •Присваивание массива Присваивание всего массива
- •Присваивание секции (вырезки) массива
- •Повторная нумерация
- •Основные встроенные процедуры
- •Массивы нулевого размера
- •Массивы и производные типы
- •Инициализация массивов Конструкторы
- •Оператор data
- •Встроенные функции для массива
- •Пример упрощения
- •Пример исследования (запроса)
- •Пример конструирования
- •Пример локализации
- •Я Операторы управления
- •Вложения
- •Порядок операторов
- •Синтаксис программы Main
- •Формат представления программы
- •Программные единицы
- •Уровни доступа
- •Дополнения
- •Спецификация входных-выходных параметров
- •Использование модуля
- •Родовые подпрограммы
- •Интерактивный ввод-вывод
- •Простой Input и Output
- •Форматирование по умолчанию
- •Форматированный ввод-вывод I/o
- •Дескрипторы редактора
- •Вещественные - форма с фиксированной точкой
- •Вещественные - экспотенциальная форма
- •Символьные
- •Логические
- •Заполнение пробелами (пропуск символьных позиций)
- •Специальные символы
- •Списки ввода-вывода
- •Производные типы данных
- •Неявный цикл do
- •Ввод-вывод без продвижения
- •Файловый ввод-вывод
- •Номера устройств
- •Операторы read и write
- •Оператор write
- •Оператор open
- •Оператор close
- •Оператор inquirе
- •Динамический массив
- •Распределяемые массивы
- •Спецификация
- •Выделение и возвращение памяти
- •Статус распределяемых массивов
- •Потоки памяти (куча)
- •Что есть указатели?
- •Указатели и адресаты
- •Спецификации указателя Общая форма для операторов определения указателя и адресата такая:
- •Присваивание указателя
- •Разыменование (Dereferencing)
- •Статус (состояние) связи указателя
- •Динамическая память
- •Общие ошибки
- •Указатели в производных типах данных
- •Связанные списки
- •Параметры - указатели
- •Функции для указателей
Вложения
Размещение конструкции одного блока внутри другого (операторы IF-THEN внутри цикла DO, и т.д.) возможно, но внутренний блок (блоки) должен быть окаймлен наружным (и) блоком (ами) с помощью соответствующих операторов. Запрещено перекрывать вложенные операторы. Например:
main: IF( sum>100 ) THEN
inner: DO i=1,n
...
ENDIF main
ENDDO inner ! запрещено, inner должен быть внутри main
Это в общем верно для всех конструкций, то есть для цикла DO , конструкций IF-THEN-ELSEIF и CASE . Максимальный уровень вложения (конструкции внутри конструкций внутри конструкций ...) зависит от компилятора.
Структура программы
Отдельная программа на Fortran 90 может быть сделана из нескольких отдельных программных модулей, называемых процедурами (внутренняя - internal, внешняя - external или модуль module)или модулями. Выполняемая программа содержит одну главную программу и некоторое число (может быть 0) других программных модулей. Важно реализовать так, чтобы внутренние детали каждого программного модуля отделены от других модулей. Только связь между модулями образует интерфейс, в котором один модуль вызывает другой по имени. Главное в написании программ с помощью программных модулей обеспечить, чтобы существовал процедурный интерфейс.
Деление программы на модули имеет некоторые преимущества:
программные модули могут быть написаны и отлажены независимо.
программный модуль, который имеет хорошо определенную задачу, легче понять и построить.
Разработанные и отлаженные модули и внешние процедуры могут быть повторно использованы в других программах (программист может построить личные библиотеки)
Хороший компилятор может лучше оптимизировать код благодаря модульной форме.
Порядок операторов
Fortran предписывает некоторый порядок операторов в программе. Любая программа или процедура должна быть написана по следующим правилам:
Заголовок программы должен быть первым оператором (PROGRAM, FUNCTION or SUBROUTINE). Оператор PROGRAM не обязятелен, но рекомендуется к использованию.
Все операторы спецификации должны предшествовать первому выполняемому оператору. Даже с помощью операторов DATA могут быть размещены с выполняемым текстом, то они должны лежать в области определения. Также хорошая идея группировать операторы FORMAT statements вместе для ясности.
Выполняемые операторы должны следовать в порядке, определяемом логикой программы.
Программа или процедура должна заканчиваться операторм END.
Внутри множества операторов спецификации требуется относительно малое упорядочение, тем не менее, в общем если один объект использован в спецификации другого, то естественно требуется, чтобы он был определен раньше. Другими словами, именованные константы (PARAMETER s) должны быть объявлены прежде, чем они могут быть использованы в качестве части объявления другого объекта.
Следующая таблица детализует порядок следования:
Упорядочение операторов
Операторы PROGRAM, FUNCTION, SUBROUTINE, MODULE или BLOC DATA |
||
Оператор USE |
||
Операторы FORMAT и ENTRY |
IMPLICIT NONE |
|
Оператор PARAMMETER |
Операторы IMPLICIT |
|
Операторы PARAMMETER и DATA |
Определение производных типов, блоки интерфейса, операторы определения типа, операторы функций-операторов и операторы спецификаций |
|
|
Операторы DATA |
Вычисляемые конструкции |
Оператор CONTAINS |
||
Внутренние процедуры или процедуры модуля |
||
Оператор END |
Выполнение программы начинается с первого выполняемого оператора главной программы (MAIN PROGRAM, где процедура, вызванная при выполнении, начинается с первого выполняемого оператора после вызванной точки входа. Невыполняемые операторы концептуально `выполнены' (!) моделированием инициализации программы, иными словами, они вызываются тогда и только тогда, когда выполняется начало главной программы.
Теперь объясним таблицу,
Может быть только 1 главная программа PROGRAM,
Может быть много программных единиц FUNCTION s и SUBROUTINE s (процедур) с уникальными именами.
Может быть некоторое число модулей MODULE s с уникальными именами, которые связаны с программой с помощью оператора USE. Модули - очень легко приспособляемые программные единицы и используют в пакете несколько средств (например, процедуры, определения типов, объявления объектов или семантические расширения). Используется очень много поддержки и замены для средств языка FORTRAN 77.
Может быть только одна подпрограмма BLOCK DATA -- они не описаны как часть курса -- это возможность определить глобальные инициализации и глобальные константы и лучше использовать операторы MODULE и USE.
Оператор USE:
Он подключает модуль, связывет объекты модуля с программным модулем, делая их доступными. Когда использует его содержимое public, оно становится лоступным как будто бы оно было объявлено непосредственно и явно в самой программной единице. Модули могут быть предварительно скомпилярованы (подобно библиотекам) или быть написаны программистом.
Любые глобальные объекты могут быть поставлены в модуль и использованы, когда это потребуется.
Оператор IMPLICIT NONE должен стоять после оператора USE. Его использование настоятельно предлагается.
Операторы FORMAT и ENTRY. Операторы Format должны быть сгуппированы вместе в одном месте кода. Операторы ENTRY реализуют механизм `вход в' середину процедуры. Его использование противоречит хорошему стилю и сильно не рекомендуется в связи с его естественной опасностью.
Операторы PARAMETER и IMPLICIT:
Оператор IMPLICIT не могут быть использованы, IMPLICIT NONE можно использовать только в форме рассмотриваемых неявных типов. (операторы IMPLICIT разрешают пользователю переопределять явно типы объектов по первой букве. Нельзя иметь оператор, если есть строка IMPLICIT NONE.)
Операторы PARAMETER, предполагает, что использован атрибутный стиль (Fortran 90) объявления PARAMETER.
Оператор DATA может быть размещен в объявлении (но не в выполнеии), общая практика состоит в их расположении после объявлений перед выполняемыми операторами.
Блоки интерфейса обычно размещены в заголовке объявлений и сгруппированы вместе.
Операторы-функции являются формой однострочного объявления оператора, взамен могут быть использованы внутренние процедуры
Выполняемые операторы это вещи, подобные операторам DO, конструкциям IF и операторам присваивания.
CONTAINS отделяет главную программную единицу ``main'' от всех локальных видимых внутренних процедур.
внутренние процедуры следуют тому же порядку как и нормальные процедуры, исключая возможность содержать внутри себя внутренние процедуры второго уровня.
оператор END ограничитель, завершающий текущую программную единицу.