Pascal. Пользовательские модули

      Комментарии к записи Pascal. Пользовательские модули отключены

Помечено: ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 3 мес., 4 нед. назад.

  • Автор
    Сообщения
  • #3746

    Модули в Паскале по отношению к основной части программы напоминают подпрограммы (процедуры и функции). Но по определению они являются самостоятельными программами, ресурсы которых могут быть задействованы в других программах. Кроме того описание модулей происходит вне вызывающего приложения, а в отдельном файле, поэтому модуль – это отдельно компилируемая программа. Файл скомпилированного модуля (именно такой нужен для использования) будет иметь расширение предусмотренное средой программирования (например, .tpu, .ppu, .pcu).

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

    Структура модуля выглядит так:

    Unit <имя модуля>;
    Interface
      <интерфейсная часть>
    Implementation
      <исполняемая часть>
    Begin
      <инициализация>
    End.

    Далее мы поочередно рассмотрим каждый из данных разделов.

    Имя модуля (Unit)

    Имя модуля, следующее после ключевого слова Unit, должно совпадать с названием файла (без .pas), в котором находиться его код. Также с помощью имени, модуль подключается к другому модулю, либо к основной программе. Для этого необходимо указать служебное слово Uses, и перечислить через запятую список подключаемых модулей:

    Uses <список имен модулей>;
    
    <h3>Интерфейсная часть (Interface)

    В интерфейсной части описываются заголовки объектов, к которым будут иметь доступ другие модули и программы. Это константы, типы, переменные и подпрограммы. Например, так может выглядеть интерфейсная часть модуля Search, содержащего в себе алгоритмы поиска элементов в массиве.

    unit Search;
    Interface
    type arr = array[1..5] of integer;
    var s: string;
    procedure binary_search(x: integer; Ar: arr; var s: string);
    procedure line_search(x: integer; Ar: arr; var s: string);

    Для объявления данного модуля, в программе нужно указать его имя:

    Uses Search;

    После чего станет возможным использование всех описанных в интерфейсной части объектов.

    Исполняемая часть (Implementation)

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

    Инициирующая часть начинает свою работу до начала выполнения основной программы. В ней (между Begin и End), как правило, описываются операторы, предназначенные для разного рода вспомогательной работы. Данная часть может отсутствовать, либо не иметь в себе никакого кода. В первом случае нужно указать End с точкой, во втором – оставить пустое место внутри Begin и End.

    Компиляция модулей

    Использовать в программе можно лишь скомпилированные модули, имеющие расширение, предусмотренное вашей средой разработки приложений. Рассмотрим три наиболее популярные из них:

    компиляция модулей в Turbo Pascal

    Итогом компиляции модуля в Turbo Pascal, будет файл с расширением .tpu (Turbo Pascal Unit), хранящий его код.

    компиляция модулей в Free Pascal

    После компиляции модуля в среде Free Pascal, создаются два файла с разными разрешениями: .ppu и .o. Первый содержит интерфейсную часть модуля, а второй (необходим для компоновки программы) – часть реализаций.

    компиляция модулей в Pascal ABC.NET

    Pascal ABC.Net во время компиляции модуля не генерирует код на машинном языке. В случае, если компиляция выполнена успешна код сохраняется в файле с разрешением .pcu.

    Для сред программирования Turbo Pascal и Free Pascal предусмотрены три режима компиляции: Compile, Make и Build. В режиме Compile все используемые в программе модули должны быть заранее скомпилированы. Приложение в режим Make-компиляции проверяет все подключенные модули на наличие файлов с соответствующим для среды программирования разрешением (.tpu или .o). Если какой-то из них не найден, то происходит поиск файла с названием ненайденного модуля и расширением .pas. Самый надежный из режимов – Build. Поиск и компиляция файлов (с расширением .pas) в данном режиме происходит даже тогда, когда модульные файлы уже имеются.

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

    unit Search;
    Interface
      type arr = array[1..5] of integer;
      var s: string;
      procedure binary_search(x: integer; Ar: arr; var s: string);
      procedure line_search(x: integer; Ar: arr; var s: string);
    Implementation
      var a, b, c, i: integer;
      procedure binary_search(x: integer; Ar: arr; var s: string);
    begin
      a:=1; b:=5; s:='NO';
      while a<=b do
      begin
        c:=a+(b-a) div 2;
        if (x<Ar[c]) then
          b:=c-1
        else if (x>Ar[c]) then
          a:=c+1
        else
        begin s:='YES'; break; end;
      end;
    end;
    procedure line_search(x: integer; Ar: arr; var s: string);
    begin
      s:='NO';
      for i:=1 to 5 do
      begin
        if (Ar[i]=x) then
        begin
          s:='YES'; break;
        end;
      end;
    end;
    end.

    Весь этот код должен находиться в отдельном файле. Теперь напишем основную программу, в которую подключим наш модуль Search.

    program modul_search;
      uses Crt, Search;
    var
      mas: array[1..5] of integer;
      n, j: integer; str: string;
      y: char;
    begin
      clrscr;
      writeln('Enter the array elements');
      for j:=1 to 5 do
        readln(mas[j]);
      write('Enter number search: '); readln(n);
      write('This array is ordered? (y/n) '); readln(y);
      if y='y' then binary_search(n, mas, str)
      else line_search(n, mas, str);
      write(str);
      readkey;
    end.

    После компиляции файлов данное приложение должно исправно работать. Конечно, если вы, отвечая на вопрос “Этот массив упорядочен?” укажите программе ложную информацию, то и она может ответить тем же.

Для ответа в этой теме необходимо авторизоваться.