Опубликован: 18.12.2012 | Доступ: свободный | Студентов: 238 / 27 | Длительность: 03:25:00
Лекция 1:

Модули

Лекция 1 || Лекция 2 >
Аннотация: Лекция рассказывает о преимуществах использования модулей для написания больших программ. Рассматриваются оператор use, атрибуты public, private, protected. Затрагивается вопрос о создании перегруженных процедур.
Ключевые слова: атрибут

Презентацию к лекции Вы можете скачать здесь.

Если много параметров?


Если много типов?


Если много процедур?


Данные и процедуры вместе


Назначение модулей

  • Данные и процедуры в одной программной единице.
  • Обмен данными между процедурами и головной программой.
  • Сокрытие типов, данных и процедур, используемых для промежуточных вычислений.
  • Раздельное написание программ.

Состав модуля

module имя_модуля
  use другие модули

  public
  private
  protected
     описание констант,
              типов, 
              модульных переменных

contains
    модульные процедуры	

end module
    

Оператор use

Позволяет использовать типы, данные и процедуры модуля

program prog
  use mathlib ! используем модуль mathlib
    

Атрибут only позволяет использовать только "избранные" данные или процедуры.

program prog
  use mathlib, only : dot
  ! кроме dot, 
  ! все остальные не используются
    

Во избежание конфликта одинаковых имен модуля и программной единицы используем операцию =>.

module math
  integer :: A = 1000,B,C
end module

program prog
  use math, AM => A
  integer A
  A = 80
  write(*,*) AM, A    ! 1000   80
end
    

Public, private и protected

Организация доступа к элементам модуля.

Public – данные и процедуры доступны в других программных единицах (по умолчанию).
Private – данные и процедуры доступны внутри модуля.
Protected – доступны только значения данных в других программных единицах (нельзя изменять данные).
module math
  integer, public :: A
  integer, private :: B
  integer, protected :: C
contains
  subroutine init()
    A = 1000; B = 2000; C = 3000
  end subroutine init
end module math

program prog
  use math
  implicit none

  call init()
  A = 50       ! public-переменная, полный доступ
  B = 100      ! private-переменная, доступна в модуле
  write(*,*) C ! protected-переменная, доступ к значению
  С = С+1        ! нельзя изменять значение 
end
    

Рекомендации по организации доступа.

Public – объявление констант, глобальных переменных, типов и процедур.
Все промежуточные и служебные переменные, процедуры и типы следует объявлять как private.
Доступ в головной программе к private данным производить при помощи public – процедур.
При необходимости использовать значения private-данных применяем protected.

Перегрузка процедур

Объединение под одним именем множества разных процедур.

  1. Процедура вызывается с разным количеством параметров.
  2. В вызове процедуры используются параметры разных типов данных.
 interface общее_имя
    module procedure имя_1, имя_2 ,..., имя_N
 end interface
    
Следим за однозначностью выбора одной из объединённых процедур!

Пример перегрузки

module math
  interface prod
    module procedure umn, scalar, vector
  end interface 
contains  
  real function umn(A,B) ! умножение чисел
    real A,B
      umn = A*B
  end function umn

  real function scalar(A,B) ! скалярное умножение
    real A(3), B(3)
     scalar = A(1)*B(1)+A(2)*B(2)+A(3)*B(3)
  end function scalar

  subroutine vector(A,B,C)  ! векторное умножение
    real A(3), B(3), C(3)
     C(1) = A(2)*B(3)-B(2)*A(3)
     C(2) = A(3)*B(1)-A(1)*B(3)
     C(3) = A(1)*B(2)-A(2)*B(1)
  end subroutine vector
end module math
program prog
  use math
  real A(3), B(3), C(3)

  A = [2.0, -4.0, 5.0]
  B = [4.0, -3.0, 0.0]

  write(*,*) "Number = ", prod(4.0,5.0)
  write(*,*) "Scalar product = ", prod(A,B)
  
  call prod(A,B,C)
  write(*,*) "Vector product = ", C
end
        

Результат работы программы.

Number =    20.00000
Scalar product =    20.00000
Vector product =    15.00000       20.00000       10.00000
        

Требования для перегрузки

В каждой паре перегружаемых процедур хотя бы один параметр должен отвечать двум требованиям:

  1. по своему положению не имеет аналогов по типу;
    module MD
      interface func
        module procedure F1, F2
      end interface 
    contains  
      real function F1(A,B) ! A  и  B  вещественного типа
        real A, B
          ...
      end function F1
      real function F2(C,D) ! С  и  D  вещественного типа
        real C, D
          ...
       end function F2
    end module MD
              
  2. формальный параметр с таким же именем отсутствует в списке параметров другой процедуры.
    module MD ! --- warning
      interface func
        module procedure F1, F2
      end interface 
    contains  
      real function F1(A,B)
        real A
        integer B
          ...
      end function F1
      real function F2(B,A)
        real A
        integer B
          ...
       end function F2
    end module MD
                  
    module MD
      interface func
        module procedure F1, F2
      end interface 
    contains  
      real function F1(A,B)
        real A
        integer B
          ...
      end function F1
      real function F2(C,D)
        real D
        integer C
          ...
       end function F2
    end module MD
                  

О модулях…

  1. Легкое составление, отладка и модификация программных единиц независимо друг от друга.
  2. Использующая программа не знает как устроен модуль, она умеет с ним общаться при помощи процедур.
  3. Хороший модуль снаружи лучше чем внутри и его лучше использовать чем построить.
  4. Следует избегать создания модулей, работа которых будет зависеть от предыстории.
Лекция 1 || Лекция 2 >