- •Вопрос36. Двухуровневая структура программ. Присоединение (ассоциирование) данных носителя к процедуре
- •Вопрос37. Трёхуровневая структура модуля. Присоединение (ассоциирование) данных модуля к программе
- •Вопрос 38. Модульные, внешние и внутренние программы
- •Вопрос 41. Оператор и конструкция forall
- •Вопрос 42. Оператор и конструкция where
Вопрос37. Трёхуровневая структура модуля. Присоединение (ассоциирование) данных модуля к программе
Модуль, как трёхуровневая структура, может содержать модульные процедуры, которые, в свою очередь, могут содержать внутренние процедуры. Имена общедоступных public-объектов (в модуле атрибут public – по умолчанию) - заимствуют его модульные и их внутренние процедуры, а также все, кто использует этот модуль, как-то: другие модули, внешние программы и, транзитом, их внутренние процедуры. Можно вызывать модульные процедуры используемого модуля, тогда как их внутренние процедуры недоступны. Private-объекты модуля доступны только модульным процедурам и их внутренним процедурам. Использование модулей позволяет глобальный объект проекта описать однократно в модуле. Затем в проекте любой сложности, используя модуль, получить доступ к его объектам и модульным процедурам. Немаловажно иерархическое описание объектов, которое реализуется через иерархию использования модулей.
Module имя_модуля ! уровень 1 [1] use имя_другого_модуля [2] описания производных типов данных [3] public ! описания общедоступных переменных (по умолчанию) [4] private ! описания переменных, доступных только в модуле [5] описания интерфейсов [6] описания списков Namelist ! д е й с т в и й в м о д у л е н е т contains |
End module имя_модуля |
Вопрос 38. Модульные, внешние и внутренние программы
Когда проект становится не простым для восприятия, самое время подразделить текст на так называемые процедуры. Часть кода, которая повторяется неоднократно, или легко управляется и подстраивается аргументами образует Процедуру.
Различают 2 вида процедур:
процедуру с единственным результатом можно оформить как функцию Function
процедуру с любым количеством результатов оформляют как подпрограмму Subroutine
Следует понимать, что системы обозначений вызывающей программы и вызываемой процедуры совершенно независимы. Данные между вызывающей программой и вызываемой процедурой передаются в обоих направлениях и могут быть входными IN, выходными OUT и входными-выходными INOUT. При вызове процедуры надо соблюдать соответствие типов аргументов вызывающей программы и вызываемой процедуры. Если в главной программе надо вычислить функцию poisson(m,s) для аргументов m и s, то эти аргументы в порядке следования попарно должны соответствовать типам аргументов функции poisson. Нарушения приводят к сообщениям об ошибках несоответствия типов.
Fortran-90 декларировал еще 2 способа общения между вызывающей программой и вызываемой процедурой:
присоединение данных носителя
присоединение данных модуля
Имеется 4 вида программных единиц
Program Module subroutine Function
Процедура-функция Function - это функция, которая слишком сложна, чтоб её определить однострочной операторной функцией, как это делалось в предыдущих уроках.
Программные единицы в Fortran-90 подразделяются на
внешняя программная единица с собственной системой обозначений - она может компилироваться самостоятельно - главная программа и модуль могут быть только внешними программными единицами - subroutine или function могут быть и внешними, и внутренними программными единицами
внутренняя Процедура с системой обозначений, в которую к собственным обозначениям добавлены неповторяющиеся обозначения внешней охватывающей программной единицы - она не может компилироваться самостоятельно, так как образует с внешней программной единицей единый текст - внутренними процедурами могут быть только subroutine или function
внешняя программа может содержать несколько внутренних процедур после единственного contains и до её end
сложнее устроен модуль - он содержит модульные программы, каждая из которых может содержать внутренние процедуры
Внешняя процедура-функция Fortran-90 снимает ряд ограничений, присущих внутренним процедурам-функциям. Их свойства
собственно определение внешней функции - это непосредственно текст до contains, если он есть и end после пачки внутренних процедур, в которых видны объекты внешней программы (но не наоборот)
процедура-функция содержит объявления объектов и необходимые действия; причем где-либо среди действий должна быть хотя бы одна строчка, присваивающая функции значение
Внешняя процедура-функция может быть вызвана в любом месте проекта
Внешняя процедура-функция имеет собственную систему обозначений и может компилироваться самостоятельно
Внешняя процедура-функция может использовать модуль, присоединяя описанные в нем общедоступные объекты и вызывая модульные процедуры