Пример модульной программы программирования

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

Создание проекта В Turbo C 2.0 файл проекта создается пользователем вручную. Создайте новый файл (выберите в меню File | New ). Введите имена файлов программы, включаемых в проект (каждое имя с новой строки или разделяя имена пробелами). Сохраните этот файл проекта, указав после имени расширение .prj. В Borland C++ 3.1 файл проекта создается системой в диалоге с пользователем. Выберите в меню Project | Open project… . Откроется окно диалога “Open Project File”. В поле списка “Files” этого окна выберите нужный каталог. Затем введите имя проекта с расширением .prj в поле “Open Project File” и нажмите клавишу [Enter] или кнопку “OK”. Рис. Окно диалога “Open Project File” Далее выберите в меню Project | Add item или нажмите клавишу [Insert], чтобы добавить в проект файлы. В появившемся окне диалога (рис.10.2) в поле “Name” введите имя файла или выберите его из списка “Files” и нажмите кнопку “Add”. После добавления в проект всех имен файлов нажмите кнопку “Done”.

Рис. Окно диалога “Add to Project List” Открытие и работа с проектом В Borland C++ 3.1 для открытия проекта выберите в меню Project | Open project… и в появившемся окне диалога введите или выберите имя своего файла проекта. Нажмите клавиши Ctrl – F9 (или выберите в меню команды Run | Run ), чтобы запустить компиляцию, компоновку и выполнение программы. При этом неважно, текст какого файла находится в окне редактирования (можно вообще файлы программы не открывать, если они не будут редактироваться). Пример создания многомодульной программы Рассмотрим пример программы из лабораторной работы № 8, которая формирует список идентификаторов. Создадим заголовочный файл “spisok.h” , который будет содержать директивы препроцессора, описание типа элемента списка и прототипы функций (подпрограмм): #include 136

#include
#include
#include
#define MAXDL 9 (с признаком
/* макс. длина идентификатора
конца ‘\0’ ) */ элемента списка */
struct EL_SP /* тип

< char id [MAXDL];/* идентификатор */ struct EL_SP *sled; /* ссылка на следующий элемент */ >; void Vkl ( struct EL_SP **p, char t_id[] ); void PechSp ( struct EL_SP *p ); Каждую функцию программы поместим в отдельный файл, добавив в начало директиву #include “spisok.h”. Файл “Vkl.c”:

#include «spisok.h» */
/*————————————————-

/* функция включения очередного идентиф. в список */

/*————————————————- */
void Vkl ( struct EL_SP **p, char t_id[] )
/* Вх. данные: *p — указатель списка
идентификаторов в лексикографическом порядке,
t_id — включаемый в список (текущий) ид-р */
/* Вых. данные: *p */

< struct EL_SP *pt,/* указатель включаемого эл-та */

*k,*j; /* указатели очередного и предыдущего
элементов списка */

/* выделение памяти для нового эл-та списка */ pt = (struct EL_SP *) malloc(sizeof(struct EL_SP)); strcpy(pt->id, t_id); if (*p==NULL || strcmp(pt->id,(*p)->id) < 0) < /* включение ид-ра в начало списка */ pt->sled=*p; *p=pt; > else < /* поиск элемента списка, после которого нужно включить идентификатор */ k=*p; while (k!=NULL && strcmp(pt->id,k->id)>=0) < j=k; k=k->sled; > /* включение эл-та *pt после элемента *j */ j->sled=pt; pt->sled=k; >
> Файл “PechSp.c”:

#include «spisok.h» */
/*————————————————— функция печати списка
/* */
/*————————————————— */
void PechSp ( struct EL_SP *p ) */
/* Вх. данные: p — указатель начала списка

< struct EL_SP *i; /* указатель текущего элемента списка */ printf ("\nРезультат:\n"); for ( i=p; i!=NULL; i=i->sled ) puts (i->id); > Файл “main.c”:

#include «spisok.h» */
/* ——————————————— О С Н О В Н А Я П Р О Г Р А М М А
/* */
/*——————————————— */

PechSp.c main.c Откроем проект “spisok.prj” и запустим программу на выполнение. В результате компиляции программы для каждого исходного модуля будет получен объектный модуль (файлы “Vkl.obj”, “PechSp.obj”, “main.obj”), а затем редактор связей создаст из них выполнимый модуль “spisok.exe”. При повторном запуске программы, если исходные файлы не изменялись, перекомпиляция программы не происходит. Если вы измените текст какого-либо исходного файла, выполните команду меню Compile | Make , чтобы перекомпилировать только этот файл программы (а не все) и получить новый exe -файл. Если какие-то модули программы изменяться уже не будут, можно в проект включить не исходные модули, а объектные. Изменим файл проекта, заменив файлы с подпрограммами на их объектные модули: Vkl.obj PechSp.obj main.c Снова выполним программу. Можно объектные файлы программы, которые не будут больше изменяться, поместить в отдельную библиотеку (файл с расширением .lib ) . Для создания библиотеки служит программа-библиотекарь tlib из системы Turbo C или Borland C++. Создадим библиотечный файл “spisok.lib”, содержащий файлы “Vkl.obj” и “PechSp.obj”. Для этого вызовем программу-библиотекарь, введя в командной строке MS DOS следующую команду: tlib spisok.lib + Vkl + PechSp Заменим в файле “spisok.prj” объектные модули на библиотечный модуль: Spisok.lib main.c и снова выполним программу.

Контрольные вопросы Что такое модуль? Что такое проект? Какие файлы можно включать в проект? Для чего нужны заголовочные файлы? Как создать библиотеку объектных модулей?

Источник

C Урок 19. Модульное программирование. Раздельная компиляция

Теперь мы с вами подошли к такой ситуации, что код наших проектов достиг такой величины, что уже сложно стало его читать, потому что все функции, причём разнообразного назначения, все константы, макросы, глобальные переменные у нас находятся в одном файле main.c. Дальше такое продолжаться не может, и нам нужно теперь будет как-то разбить наш проект на какие то части по их функциональному назначению. Такие части в языке C существуют, они также поддерживаются всеми средами программирования, системами сборки и компиляторами. Они именуются модулями.

Модуль в языке C — это как правило совокупность файла с исходным кодом, как правило имеющим расширение c, и заголовочного файла. Также модуль может быть и с закрытым исходным кодом. Это статическая библиотека. Но о них будет отдельный разговор скорее всего в отдельном занятии.

Заголовочный файл, или как его ещё называют header-файл — это файл, в котором обычно находятся подключения всяческих других заголовочных файлов, библиотек, прототипы функций, некоторые глобальные переменные, структуры, массивы, указатели, макросы и прочие объявления, которые вполне могли бы находиться и в файле с исходным кодом, но, во-первых они его загромождают чрезмерной информационной нагрузкой, а также, благодаря заголовочному файлу, при его подключении в другие файлы становятся доступными многие ресурсы из модуля, частью которого данный файл является. Заголовочные файлы как правило имеют расширение h.

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

Процесс раздельной компиляции можно изобразить в виде вот такой диаграммы

Пока мы сегодня будем собирать наш проект также с помощью командного файла, но вскоре перейдём к более серьёзному инструменту — системе сборки — утилите make, с помощью которой полностью будет иметь смысл наша раздельная компиляция. Настоящая раздельная компиляция имеет цель не просто скомпилировать раздельно каждый модуль, но и компилировать только те модули, в которых произошли изменения. Неизменённые модули компилировать незачем, так как таких модулей может быть до тысячи и тогда процесс компиляции будет продолжаться огромное количество времени. Пока же с помощью командного файла у нас будет происходить только мнимая раздельная компиляция. Да у нас и модулей-то будет немного.

Пока мы создаём проект, как и прежде, из проекта прошлого занятия с именем MYPROG18 и присвоим ему имя MYPROG19.

Откроем файл main.c и в функции main(), как обычно, удалим весь код тела кроме возврата нуля, останется от него вот это

return 0 ; //Return an integer from a function

Функцию menu() тоже удалим.

Давайте теперь создадим заголовочный файл main.h в папке с нашим проектом вот с таким содержимым

Источник

Читайте также:  Особенности математической модели динамического программирования
Оцените статью