Главная страница
Навигация по странице:

  • 8.2. Использование программных единиц в проекте

  • 8.3. Работа с проектом в среде DS

  • 8.4. Главная программа

  • 8.7. Модули

  • современный фортран , Бортеньев. О. В. Бартеньев Современный Фортран


    Скачать 2.24 Mb.
    НазваниеО. В. Бартеньев Современный Фортран
    Анкорсовременный фортран , Бортеньев.pdf
    Дата28.05.2018
    Размер2.24 Mb.
    Формат файлаpdf
    Имя файласовременный фортран , Бортеньев.pdf
    ТипДокументы
    #19729
    страница24 из 49
    1   ...   20   21   22   23   24   25   26   27   ...   49
    216

    8. Программные единицы объявленные PRIVATE компоненты модуля доступны в других (кроме
    BLOCK DATA) программных единицах.
    В Фортране существует два вида процедур: подпрограммы и функции.
    Подпрограмма - это именованная программная единица, в заголовке которой присутствует оператор SUBROUTINE. Вызов подпрограммы осуществляется по ее имени в операторе CALL или при выполнении задаваемого присваивания.
    Функция - это именованная программная единица, вызов которой выполняется по ее имени из выражения. В ее заголовке присутствует оператор FUNCTION. Функция содержит результирующую переменную, получающую вследствие выполнения функции значение, которое затем используется в выражении, содержащем вызов функции. Также функция вызывается и при выполнении задаваемой операции.
    В Фортране можно задать внешние, внутренние и модульные процедуры.
    Внешняя процедура является самостоятельной программной единицей и существует независимо от использующих ее программных единиц. К любой внешней процедуре можно обратиться из главной программы и любой другой процедуры.
    Модули и внешние процедуры могут компилироваться отдельно от использующих их программных единиц.
    Внутренняя процедура задается в главной программе, внешней или модульной процедуре. Главная программа или процедура называются
    носителями содержащихся в них внутренних процедур. Обратиться к внутренней процедуре можно только внутри ее носителя. Сами же внутренние процедуры уже не могут содержать в себе других внутренних процедур.
    Модульная процедура задается в модуле и доступна, если она не объявлена PRIVATE, в любой использующей модуль программной единице. Модуль также является носителем по отношению к заданной в нем модульной процедуре, которая, в свою очередь, может быть носителем определенной в ней внутренней процедуры.
    Фортран 90 и 95 в отличие от Фортрана 77 поддерживают рекурсивные вызовы процедур, т. е. такие вызовы, в которых процедура прямо или косвенно обращается сама к себе. Оператор заголовка рекурсивной процедуры содержит префикс RECURSIVE.
    8.2. Использование программных единиц в проекте
    В создаваемом пользователем проекте могут использоваться:

    встроенные процедуры;

    подключаемые процедуры и модули;

    создаваемые при разработке проекта процедуры и модули.
    217

    О. В. Бартеньев. Современный ФОРТРАН
    Встроенные процедуры входят в состав Фортрана и автоматически включаются в исполняемый код при обращении к ним в тексте программы.
    Примеры встроенных процедур: SIN, ALOG, TRIM.
    Подключаемые процедуры и модули находятся в ранее созданных и поставляемых с Фортраном библиотеках. Перечень и описание таких модулей и процедур дан в прил. 3.
    Также с CVF и FPS поставляются математические библиотеки и библиотеки математической статистики.
    Все поставляемые с CVF и FPS процедуры при правильной установке программ по умолчанию доступны для компилятора и компоновщика.
    Для их использования в программной единице следует выполнить ссылку на модуль, содержащий глобальные данные и интерфейсы процедур.
    Ссылка осуществляется оператором USE.
    Пользователь может создать собственные прикладные библиотеки и использовать хранимые в них процедуры и модули в любом из своих проектов. Для доступа к содержащим объектный код библиотекам пользователю следует указать построителю ее полное имя.
    Процедуры и модули проекта содержат свежие решения и на начальных стадиях разработки хранятся в исходном коде. Размещаются новые программные единицы, как правило, в разных файлах. Если в файле находится несколько процедур или модулей, то порядок их размещения произвольный. Однако текст модуля должен быть размещен до первой имеющейся на него ссылки. В общем случае в одном файле могут существовать внешние процедуры, модули и главная программа. В то же время осмысленное разбиение программных единиц по файлам, порядок их размещения в каждом из файлов, правильное разделение процедур на внешние, внутренние и модульные существенно облегчает разработку программы и ее последующее сопровождение в процессе эксплуатации.
    На последующих стадиях работы над программой часть отлаженных процедур и модулей может храниться в откомпилированном виде
    (объектном коде), часть - включена в библиотеки, содержащие объектный код программных единиц. Недоработанные программные единицы по- прежнему хранятся в исходном коде.
    Создаваемые процедуры и модули реализуют выделенные при разработке алгоритма фрагменты и решают проблемы обмена данными между ними. Фрагмент реализуется в виде процедуры, если он:

    представляет типовую задачу, например поиск экстремума функции;

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

    8. Программные единицы тестирования. Вопрос выбора типа процедуры (внешней, модульной или внутренней) неразрывно связан с проблемой организации данных.
    Процедуры и модули полезны и по другой причине. Часто к работе над большим проектом необходимо привлечь бригаду программистов.
    Организовать работу бригады можно, лишь поручив каждому участнику реализацию той или иной группы процедур и модулей. Понятно, что предварительно должна быть определена общая структура программы, выделены фрагменты, определены данные, которыми фрагменты обмениваются, и способы обмена данными (ассоциирование параметров, ассоциирование через носитель, use-ассоциирование, ассоциирование памяти). Такая предварительная и чрезвычайно важная работа называется
    проектированием программы.
    Итак, процедуры и модули:

    позволяют сократить расходы на создание программы;

    улучшают читаемость программы и, следовательно, облегчают ее последующую модификацию;

    приводят к сокращению исходного кода;

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

    позволяют разделить работу над программой между разными программистами.
    8.3. Работа с проектом в среде DS
    В CVF и FPS программа рассматривается как проект. Типы возможных проектов приведены в табл. 8.1.
    Таблица 8.1. Типы проектов
    Тип проекта
    Особенности
    Консоль (EXE)
    Однооконный основной проект без графики
    Стандартная графика (EXE)
    Однооконный основной проект с графикой
    QuickWin-графика (EXE)
    Многооконный основной проект с графикой
    Windows-приложение (EXE)
    Многооконный основной проект с полным графическим интерфейсом и Win32 API- функциями
    Статическая библиотека (LIB) Библиотечные процедуры, подключаемые в EXE- файлы
    Динамическая библиотека
    (DLL)
    Библиотечные процедуры, подключаемые в процессе выполнения
    Первые 4 типа требуют наличия главной программы. Два последних - библиотечные проекты без главной программы.
    Тип проекта задает вид генерируемого кода и некоторые параметры проекта. Например, он определяет опции, которые использует компилятор,
    219

    О. В. Бартеньев. Современный ФОРТРАН
    библиотеки, применяемые компоновщиком, задает по умолчанию размещение выходных файлов, константы проекта и т. д. Задание типа проекта выполняется при его создании. Порядок создания проекта в CVF и
    FPS и некоторые операции с проектами рассмотрены в разд. 1.2.
    После создания нового проекта можно сгенерировать две его модификации: Debug и Release. Первая - содержит применяемые в режиме отладки настройки компилятора и компоновщика. Вторая - ориентирована на получение рабочего, не содержащего отладочного кода EXE-файла.
    В любой из них можно изменить настройки компилятора и компоновщика.
    Используя цепочку Build - Configurations можно добавить или удалить модификацию. Каждая из модификаций может быть сгенерирована в своей директории. По умолчанию имя директории для модификации совпадает с именем модификации, но оно может быть изменено в результате выполнения цепочки Build - Settings - General - установить директории в полях области Output directories - OK. Генерируемую по умолчанию модификацию можно изменить, выполнив цепочку Build - Set (Active) De- fault Configuration - выбор конфигурации - OK.
    В проекте используются файлы с исходными текстами программ и файлы ресурсов, хранящие, например, диалоговые окна. Также могут быть ссылки на модули (оператор USE), файлы с объектным кодом (ссылка указывается как параметр опции построителя) и динамически подключаемые библиотеки (в результате употребления атрибута
    DLLIMPORT). Кроме того, в исходном коде можно указать путь к библиотекам, содержащим вызываемые процедуры, применив нужное число раз директиву $objcomment lib : "имя библиотеки". Указанное имя будет сохранено в объектном коде и затем использовано компоновщиком при сборке приложения.
    Модули, если их исходный код не содержится в проекте, ищутся компилятором по имени, указанному в операторе USE. Расширение искомых файлов - MOD. Порядок поиска:
    1)
    поиск в директории, содержащей файлы проекта;
    2)
    в директориях, заданных в опции компилятора /I в порядке их следования. При задании в опции более одной директории имена директорий разделяются пробелами: /I "myfiles/" /I "mylib/";
    3)
    в директориях, заданных в переменной окружения INCLUDE, например в файле autoexec.bat.
    Кроме того, в проект можно включить файл с исходным текстом, употребив строку INCLUDE или директиву $INCLUDE. Строка (директива) может содержать полное имя включаемого файла (т. е. имя и путь к файлу).
    Если же полное имя файла не указано, то компилятор ищет файл в той же последовательности, какая применяется для модуля.
    220

    8. Программные единицы
    При нахождении модуля (включаемого файла) поиск прекращается.
    В случае неудачи генерируется сообщение об ошибке.
    В среде DS директории для поиска модулей и включаемых файлов можно установить, выполнив цепочку Tools - Options - Show directories for
    Include files - добавить нужную директорию - OK. Также директории указываются и в результате выполнения цепочки (Project) Build - Settings –
    Fortran - Preprocessors - занести в поле INCLUDE and USE paths пути к файлам - OK. Путь к файлам завершается слешем. При наличии нескольких путей они разделяются запятыми, например: myfiles/, mylib/. Заданные опции компилятора отображаются в поле Project Options.
    8.4. Главная программа
    Создаваемый в результате компиляции и компоновки исполняемый файл называется приложением. Любое приложение содержит одну главную программу, которая в общем случае имеет вид:
    [PROGRAM имя программы]
    [операторы описания]
    [исполняемые операторы]
    [CONTAINS
    внутренние процедуры]
    END [PROGRAM [имя программы]]
    Оператор PROGRAM необязательный. Однако же если он присутствует, то должно быть задано и имя программы - любое правильно сформированное имя Фортрана. Если оператор END содержит имя
    программы, то оно должно совпадать с именем, заданным в операторе
    PROGRAM.
    Главная программа не может содержать операторы MODULE и BLOCK
    DATA. Раздел описаний не может содержать операторы и атрибуты OP-
    TIONAL, INTENT, PUBLIC и PRIVATE. Включение атрибута или оператора SAVE не имеет никакого эффекта. Операторы SUBROUTINE,
    FUNCTION, RETURN и ENTRY не могут появляться среди исполняемых операторов главной программы, но могут размещаться после оператора
    CONTAINS.
    Выполнение приложения всегда начинается с первого исполняемого оператора главной программы. Оператор END, если в результате вычислений на него передается управление, завершает выполнение приложения. Оператор может иметь метку, используя которую можно перейти на END от других исполняемых операторов. Нормальное завершение приложения может быть также выполнено оператором STOP, который может появляться как в главной программе, так и в процедуре.
    221

    О. В. Бартеньев. Современный ФОРТРАН
    8.5. Внешние процедуры
    В Фортране могут быть определены два типа процедур: подпрограммы и функции. Функция отличается от подпрограммы тем, что вызывается из выражения и возвращает результат, который затем используется в этом выражении. Тип возвращаемого результата определяет тип функции.
    При задании внешней функции следует объявлять ее тип в разделе объявлений вызывающей программной единицы так же, как это делается для других объектов данных.
    Процедуру следует оформлять в виде функции, если ее результат можно записать в одну переменную, в противном случае следует применить
    подпрограмму.
    Структура подпрограммы имеет вид:
    заголовок подпрограммы
    [операторы описания]
    [исполняемые операторы]
    [CONTAINS
    внутренние процедуры]
    END [SUBROUTINE [имя подпрограммы]]
    Аналогично выглядит структура функции:
    заголовок функции
    [операторы описания]
    [исполняемые операторы]
    [CONTAINS
    внутренние процедуры]
    END [FUNCTION [имя функции]]
    Функция содержит результирующую переменную, в которую устанавливается возвращаемый функцией результат. В Фортране 77 имя результирующей переменной всегда совпадало с именем функции. Ныне в предложении RESULT можно задать для результата другое имя.
    Оператор CONTAINS в процедуре играет такую же роль, что и в главной программе. Выполнение оператора END приводит к передаче управления в вызывающую программную единицу. Также выход из процедуры осуществляет оператор RETURN.
    Заголовок подпрограммы содержит оператор SUBROUTINE, а заголовок функции - оператор FUNCTION. Вызов подпрограммы выполняется оператором
    CALL имя подпрограммы([список фактических параметров])
    Вызов функции выполняется из выражения, например:
    result = имя функции([список фактических параметров])
    222

    8. Программные единицы
    8.6. Внутренние процедуры
    Внутри главной программы, внешней и модульной процедуры можно после оператора CONTAINS задать внутренние процедуры. Они имеют вид:
    заголовок подпрограммы
    [операторы описания]
    [исполняемые операторы]
    END SUBROUTINE [имя подпрограммы]
    заголовок функции
    [операторы описания]
    [исполняемые операторы]
    END FUNCTION [имя функции]
    В отличие от внешних и модульных процедур внутренние процедуры не могут содержать других внутренних процедур. В отличие от внешних процедур внутренние процедуры, так же как и модульные, обязательно содержат в операторе END слово FUNCTION в случае функции или SUB-
    ROUTINE в случае подпрограммы. Внутренняя процедура имеет доступ к объектам носителя, включая возможность вызова других его внутренних процедур. Внутренние процедуры обладают явно заданным интерфейсом
    (разд. 8.11.3), поэтому тип внутренней функции не должен объявляться в ее носителе.
    8.7. Модули
    Модуль используется для задания глобальных данных и модульных процедур. Он имеет вид:
    MODULE имя модуля
    [раздел описаний]
    [CONTAINS
    модульные процедуры]
    END [MODULE [имя модуля]]
    Раздел описаний может содержать определения встроенных типов данных, объявления данных, функций и их атрибутов, интерфейсные блоки и namelist-группы. При объявлении данных им могут быть присвоены начальные значения. Операторы объявления данных могут содержать атрибуты ALLOCATABLE,
    AUNOMATIC,
    DIMENSION(dim),
    EXTERNAL,
    INTENT,
    INTRINSIC,
    OPTIONAL,
    PARAMETER,
    POINTER,
    PRIVATE,
    PUBLIC,
    SAVE,
    STATIC,
    TARGET
    и VOLATILE (последний атрибут применим только в CVF). Каждый атрибут может быть задан в операторной форме. Также раздел описаний может включать операторы COMMON,
    DATA, EQUIVALENCE, IMPLICIT, NAMELIST, USE. Раздел описаний не может содержать ни одного выполняемого оператора.
    223

    О. В. Бартеньев. Современный ФОРТРАН
    Следующие за оператором CONTAINS модульные процедуры должны завершаться END SUBROUTINE [имя подпрограммы] или END FUNCTION
    [имя функции]. Модульные процедуры, в свою очередь, после оператора
    CONTAINS могут содержать внутренние процедуры. Имя модуля, если оно следует за END MODULE, должно совпадать с именем в заголовке модуля.
    Доступ к модулю в программной единице осуществляется посредством оператора USE, который предваряет раздел объявлений программной единицы.
    Объявленные в операторах описания модуля имена доступны:

    в модульных процедурах;

    во внутренних процедурах модуля;

    в использующих модуль программных единицах (если имена не объявлены PRIVATE).
    Модульные процедуры доступны:

    в других модульных процедурах модуля;

    в использующей модуль программной единице (если они не объявлены
    PRIVATE).
    Внутренняя процедура модуля доступна только в содержащей ее модульной процедуре - носителе.
    Объявленные в раздел описаний модуля переменные и модульные процедур, не защищенные атрибутом PRIVATE, называются глобальными
    объектами модуля.
    На модуль, используя оператор USE, можно сослаться:

    в главной программе;

    во внешней процедуре;

    в другом модуле.
    При ссылке на модуль в другом модуле следует следить, чтобы модуль не ссылался сам на себя ни прямо, ни косвенно через другие модули.
    Замечание. Одно из применений модулей - это накопление интерфейсов внешних процедур, в том числе написанных на иных языках программирования. Например, поставляемый с CVF модуль DFCOM содержит интерфейсы, применяемые с объектами ActiveX процедур. Сами же процедуры содержатся в библиотеке dfcom.lib.
    Пример: module testmod
    ! Переменные a, b и c доступны в smod и smod2 и в любой программной единице,
    ! содержащей ссылку USE TESTMOD integer, save :: a = 1, b = 1 integer, private :: c = 1
    ! Объявленная PRIVATE переменная c contains ! доступна только в модуле TESTMOD
    1   ...   20   21   22   23   24   25   26   27   ...   49


    написать администратору сайта