Модульное программирование

Часто исходные тексты программ достаточно объёмные и содержат множество различных функций. В таких случаях имеет смысл разбить исходный текст программы на отдельные модули, в которых будут рамещаться функции программы, сгруппированные тем или иным образом. Обычно каждый модуль представлен двумя файлами:
  1. заголовочным файлом (.h), в котором описаны все директивы препроцессора, прототипы функций и описания глобальных переменных, необходимых для работы данного модуля;
  2. файлом реализации модуля (.c);

Постановка задачи и предварительные действия

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

Теперь необходимо создать рабочий каталог с файлами программы и перейти в него:

$ mkdir circle
$ cd circle

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

Главный модуль - main.c

$ vim main.c

main.c.png

Главный модуль - main.h

$ vim main.h

main.h.png

Заголовочный файл геометрического модуля - geometry.h

$ vim geometry.h

geometry.h.png

Модуль ввода данных - input.c

$ vim input.c

input.c.png

Модуль ввода данных - input.h

$ vim input.h

input.h.png

Заголовочный файл расчётного модуля - calc.h

$ vim calc.h

calc.h.png

Геометрический модуль - geometry.c

$ vim geometry.c

geometry.c.png

Расчётный модуль - calc.с

$ vim calc.c

calc.c.png

Сборка приложения

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

Существует несколько утилит для автоматизированной сборки приложений, наиболие часто используется make. Документация по этой программе доступна здесь.

Идея сводится к тому, что нужно написать специальный файл - сценарий сборки приложения (Makefile), в котором описаны правила сборки (rules), включающие цели (targets), зависимости (prerequisites) и действия (recipes), а также необходимые переменные.

Таким образом, в редакторе необходимо набрать текст следующего файла-сценария:

$ vim Makefile

Замечание 1. Обратите внимание, что название сценария сборки должно быть именно таким: Makefile с заглавной буквы.

Замечание 2. Когда доберётесь до этого пункта, обратитесь к преподавателю для правильного оформления инструкций сборки (либо самостоятельно включите настройку тектового редактора vim :set noet и для отделения действий используйте табуляцию).

Makefile-1.png

После этого собираем проект:

$ make

при необходимости исправляем ошибки и исследуем работу программы:

$ ./circle