Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






End function s_matr

Модули

Наибольшее число ошибок времени исполнения возникают при некорректном использовании процедур. Они плохо диагностируются и могут не обнаружиться. Этот класс ошибок можно избежать путем явного задания интерфейсов в интерфейсном блоке. Описание интерфейсов во всех программных единицах громоздко и перегружает программный код лишней информацией. В этом случае все интерфейсы помещают в модуль. Для того, чтобы избежать ошибок при вызове процедур, необходимо создать модуль, содержащий описание интерфейса всех процедур, в них также описывают используемые в контексте этих процедур именованные константы (например, pi). Таким образом, проект будет состоять из файла с главной программой, файлов процедур и модуля с интерфейсами этих процедур.

В Фортране имена процедур (в заголовках программных единиц), являются глобальными. Данные, описанные в программной единице, локализованы в ней (локальные). Внешняя процедура не видит данные, описанные в главной программе или в другой программной единице. Процедура получает данные из другой программной единицы через механизм формальных и фактических параметров. В Фортране традиционно можно было использовать другой механизм обмена - общих блоков common. Это общие области памяти, которые доступны разным программным единицам (отрезок памяти, используемый несколькими программными компонентами). Это устаревшее средство, которое может встречаться в старых программах. В современном Фортране для этой же цели существуют специальные программные единицы модули. Средства модулей для описания глобальных объектов более защищенные от ошибок, чем традиционное для Фортрана средство общих блоков common.

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

Модули могут содержать переменные, константы, модульные процедуры, которые будут доступны всем программным единицам, подключающим этот модуль. Использование модулей позволяет осуществлять доступ к глобальным данным. Количество модулей, используемых в проекте, не ограничено.

Использование модулей для описания новых типов является одним из средств ООП.

Структура модуля:

Module <имя модуля>

[<раздел (операторы) описания>]

[Сontains

<модульные процедуры>]

end [module[ < имя модуля>]]

Раздел описаний может содержать объявления данных, определения встроенных типов данных и интерфейсные блоки. При объявлении данных им могут быть присвоены начальные значения. В разделе описания могут быть подключены другие модули. Раздел описания не может содержать выполняемых операторов. Они могут появляться только внутри модульных процедур после оператора Сontains.

Процедуры, описанные внутри модуля, называются модульными. Они должны заканчиваться end <funcnion/subroutine[ имя мод. процедуры]>. При обращении к модульным процедурам интерфейс явный.

Объявленные в разделе описания переменные и модульные процедуры называются глобальными объектами модуля.

Модуль не может ссылаться сам на себя ни прямо, ни косвенно через другие модули.

Для доступа к объектам модуля в других программных единицах используется оператор Use <имя модуля>. Этот оператор открывает доступ ко всем данным, описанным в модуле. Use помещается сразу после заголовка программной единицы (в разделе объявлений он первый) до Implicit none. Модуль обычно размещается в отдельном файле. При необходимости модуль, если он находится в другом проекте или в какой-либо папке, может быть добавлен в свой проект следующим образом: Project, Add To Project, Files.

Объявленные в модуле переменные являются глобальными (видимыми в любой программной единице, ссылающейся на этот модуль). Такой способ использования данных называется Use-ассоциированием.

Объектам модуля могут быть даны атрибуты public и private. Объекты модуля, которые используются в других программных единицах, по умолчанию имеют атрибут public ( глобальный или общий ). Если объекты должны быть доступны только в пределах данного модуля, то они объявляются с атрибутом private ( локальный или частный ). Атрибуты public и private называют атрибутами видимости.

Использование модуля для совместного доступа к массиву и процедурам обработки (исключаем дублирование данных).

Пример

Дана квадратная матрица определенного размера. Для заданной матрицы написать процедуры обработки (например, нахождение суммы элементов всей матрицы и суммы элементов на главной диагонали больших X). Формирование матрицы и ее вывод осуществлять в процедуре.

Для формирования матрицы используем заполнение случайными числами.

Т.к. матрица одна и для этой матрицы необходимо написать несколько процедур обработки, то для сокращения программного кода, (чтобы не объявлять матрицу в каждой программной единице), вместо параметров будем подключать модуль описания. Кроме того, проект будет содержать модуль интерфейсов и процедуры ввода, вывода и обработки. Все процедуры оформим в виде внешних процедур.

Поместим в модуль описание матрицы, ее размер. Кроме того, можно объявить здесь же и две переменные i и j, т.к. они участвуют во всех процедурах при обработке и имеют одинаковое назначение.

! Модуль общих описания

Module global

integer, parameter:: n=10

real a(n, n)

integer i, j

End module global

модуль заголовков процедур

Module I_face

i nterface

subroutine inmatr()

end subroutine inmatr

subroutine outmatr()

end subroutine outmatr

integer function s_matr()

end function s_matr

integer function sum_maind()

end function sum_maind

End interface

End module I_face

 

!Формирование матрицы

!Это можно сделать 2 способами:

!1) формирования матрицы по элементнам

subroutine formmatr()

Use global

implicit none

real rnd

call random_seed()

do i=1,n

do j=1,n

call random_number(rnd)

a(i, j)=rnd*100-50

Enddo

Enddo

End subroutine

! Матрица будет сформирована из вещественных чисел в диапазоне от!0 до 1. Поэтому для получения других чисел использовали формулу.

!2) или другой вариант формирования матрицы - целиком

subroutine formmatr()

use global

implicit none

call random_seed()

call random_number(a)!формирование матрицы целиком

a=a*100-50

End subroutine

subroutine outmatr()

use global

implicit none

print '(<n>(2x, F4.0))', ((a(i, j), j=1, n), i=1, n)

End

integer function s_matr()

use global

implicit none

integer s

s=0

c1:do i=1,n

c2:do j=1,n

s=s+a(i,j)

enddo c2

enddo c1

s_matr=s

end function s_matr

!функция, которая определяет сумму элементов главной диагонали,!больших заданного числа х. В модуль общих описаний не включили х, т.к.!этот параметр используется только в этой процедуре.

integer function sum_maind(x)

use global

implicit none

integer, intent(in)::x

integer s

s=0

do i=1,n

if (a(i, i)>x)s=s+a(i,i)

enddo

sum_maind=s

<== предыдущая лекция | следующая лекция ==>
 | Лекція 1 Теоретичні засади СППП


Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных