Главная arrow Форум  
25.04.2024 г.
Главная
Проекты
Статьи
Начинающим
Архив новостей
Ссылки
Контакты
Поиск
Файлы
Форум
Карта сайта
Авторизация





Забыли пароль?
Ещё не зарегистрированы? Регистрация
Поддержи наш сайт!
Через WebMoney

 R785211844650
 Z210696637574
 E368177590409

Форум ARV Research
Добро пожаловать, Гость
Пожалуйста Вход или Регистрация.
Забыли пароль?
_GEN_GOTOBOTTOM Ответить

TOPIC: Модульная программа

#5898
ARV (Администратор)
Администратор
Постов: 2386
graph
В ответ на: Модульная программа 08.12.2010 18:39 Репутация: 176  
так как каждый модуль компилируется независимо, то вышеприведенный "столбик" воспринимается компилятором всякий раз ВПЕРВЫЕ. этот столбик позволяет избежать повторов в рамках одного файла, но никак не в рамках одного проекта! то есть если header1.h содержит в себе #include "demo.h", и header2.h содержит #include "demo.h", то если бы не было этого столбика в demo.h, компиляция следующего модуля была бы с ошибкой:
Code:

 #include "header1.h" #include "header2.h" #include "demo.h"

Не стыдно не знать, стыдно не учиться
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#5902
ValBag (Пользователь)
Новичок
Постов: 8
graphgraph
В ответ на: Модульная программа 09.12.2010 14:54 Репутация: 0  
ARV писал(а):
так как каждый модуль компилируется независимо, то вышеприведенный "столбик" воспринимается компилятором всякий раз ВПЕРВЫЕ. этот столбик позволяет избежать повторов в рамках одного файла, но никак не в рамках одного проекта!Вот! Вы верно уловили суть, что я не туда "грёб" и держал в голове весь проект. И это очень существенный момент, который был мной не понят. Спасибо. Теперь картина проясняется.
Тогда, если я правильно понял, присоединяя к модулям кучу заголовков с неповторяющимся текстом, можно избежать (в принципе) обрамления их содержимого такой защитой?
Когда пишут, что такие меры нужны для предотвращения дублирования переменных, то под эту категорию попадают также прототипы функций и макросы? А что еще?

P.S. Почему-то дублируется пост. Отправляю после предпромотра. Удалить не знаю как.

Содержимое поста отредактировано: ValBag, в: 09.12.2010 14:57
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#5904
ARV (Администратор)
Администратор
Постов: 2386
graph
В ответ на: Модульная программа 09.12.2010 18:31 Репутация: 176  
термин "избежать" подразумевает принятие особых мер. если вы в качестве этих мер решили держать в голове все объявления и взаимосвязи между ними для проекта с большим числом файлов - ваше право, но куда как проще сделать "обрамление" и не забивать голову этими заботами.

на счет переменных я уже говорил: не место из объявлениям в хидерах! соответственно, при правильном составлении хидера нет проблемы с переобъявлением переменных. ну а неправильное - оно неправильное и есть, что о нем говорить

если встретится 2 макроса, то компилятор среагирует на это варнингом, т.к. переобъявление макросов допстимо в принципе. вероятность задвоения прототипов функций существует, если вы именуете их по принципу "покороче, побскорее". вероятность того, что в функционально разных модулях встретится определение функции get_day_of_week() - достаточно мала, согласитесь а вот встретить повторение функции sum() вероятнее намного. некоторые предваряют именя функций сокращенным обозначением модуля, например, все функции в модуле статистических вычислений начинаются со stat_, а в модуле работы с дисплеем - с lcd_. стиль оформления своих исходников вы сами должны выбрать: для личных проектов догм и законов нет, а общие рекомендации - дело весьма расплывчатое...
Не стыдно не знать, стыдно не учиться
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#5906
ValBag (Пользователь)
Новичок
Постов: 8
graphgraph
В ответ на: Модульная программа 10.12.2010 08:23 Репутация: 0  
ARV писал(а):
термин "избежать" подразумевает принятие особых мер.Я имел в виду - теоретически ("в принципе").на счет переменных я уже говорил: не место из объявлениям в хидерах!Этот момент понятен. Отсюда выпадают только внешние переменные, с их объявлением в заголовочных файлах - им больше некуда "пристроится".
Спасибо большое за помощь! Надеюсь на это в дальнейшем, при очередных трудностях.
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#6143
Apparatchik (Пользователь)
Специалист
Постов: 123
graphgraph
В ответ на: Модульная программа 07.02.2011 19:49 Репутация: 0  
У меня есть рабочая программа, но она большая и неудобно по ней "бегать". В ней есть функции, которые производят астрономические расчёты (использую для регулировки яркости). Для того, чтоб сделать плавную смену цифр и исправить динамическую индикацию и мож ещо что решил вынести эти функции в отдельный файл чтоб немешали "бегать" и код основного файла существенно уменьшился бы. Думал просто перенести их в файл.h но теперь сомневаюсь. Да и там есть такие переменные, которые нужно брать из основного файла например месяц, год, дата, флаг летнего времени и наоборот есть такие переменные которым присваивают значения эти функции и они нужны в основном файле (на основании их значения производятся действия).

Почитав эту ветку я теперь совсем запутался как поступать:
либо перенести их в файл.h
либо в файл.с но в этом случае как правильно сказать main где они

в обоих случаях как быть с переменными? или лучше передавать нужные данные в параметрах функции, неувеличится ли при этом прошивка (осталось мало места)?

Содержимое поста отредактировано: Apparatchik, в: 07.02.2011 19:53
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#6147
ARV (Администратор)
Администратор
Постов: 2386
graph
В ответ на: Модульная программа 08.02.2011 00:11 Репутация: 176  
Apparatchik писал(а):
Почитав эту ветку я теперь совсем запутался как поступать:
либо перенести их в файл.h
либо в файл.с но в этом случае как правильно сказать main где они

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

а по поводу размера прошивки - скорее всего она увеличится, но несущественно, не в разы.
Не стыдно не знать, стыдно не учиться
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7900
FreshMan (Пользователь)
Специалист
Постов: 177
graphgraph
В ответ на: Модульная программа 14.12.2012 01:21 Репутация: 1  
зачем в хидере прототипы ф-ций ?
они нужны чтобы эти ф-ции были нужны в других модулях ?
а если они не понадобятся то и включать в хидер их не надо ?
Experience is the name everyone give to his mistakes.
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7901
ARV (Администратор)
Администратор
Постов: 2386
graph
В ответ на: Модульная программа 14.12.2012 08:49 Репутация: 176  
FreshMan писал(а):
зачем в хидере прототипы ф-ций ?
они нужны чтобы эти ф-ции были нужны в других модулях ?
а если они не понадобятся то и включать в хидер их не надо ?
не смотря на то, что язык Си оставляет на вольное усмотрение программиста очень и очень многое, традиционно сложилось так, что все нужные хидеры перечисляются директивами #include в самом начале любого исходного файла. таким образом, если в хидере имеется прототип функции, то весь модуль с этим хидером в начале "знает" об этой функции, т.е. использовать ее можно в любом месте. если же прототипа функции в хидере нет, то функция в модуле начинает существовать только после своего появления в тексте исходника. то есть если функция foo() обращается к функции fee(), то по тексту исходника fee() обязательно должна быть определена раньше, чем foo(). если же обе функции описаны в хидере, они могут располагаться в исходнике совершенно произвольно.

таким образом, размещение прототипов функций в хидерах это:
1. хороший стиль программирования
2. возможность не заботиться о порядке реализации функций в модулях
3. возможность дать знать одним модулям о наличии функций из других модулей

подводя итоги: все это не обязательно, но желательно.

P.S. то же самое относится и к описаниям глобальных переменных. только следует помнить, что в хидерах можно описывать переменные только с префиксом extern, без этого переменные в хидерах не должны упоминаться. учтите, что описание с префикосм extern это именно ОПИСАНИЕ, но не ОПРЕДЕЛЕНИЕ, т.е. запись extern int k; лишь уведомляет компилятор о наличии "где-то" переменной k типа int, но вовсе не выделяет память под нее. т.е. где-то в исходниках обязательно должна быть запись int k; иначе будет ошибка компоновщика (линкера)

Содержимое поста отредактировано: ARV, в: 14.12.2012 08:52
Не стыдно не знать, стыдно не учиться
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7902
FreshMan (Пользователь)
Специалист
Постов: 177
graphgraph
В ответ на: Модульная программа 14.12.2012 20:04 Репутация: 1  
допустим у меня есть некая ОДНОМОДУЛЬНАЯ программа
Code:

 #include <avr/io.h> void SetScreen (char raz1_2char raz3_4char d) {   ....   .... } //*********************************************************************************** void SetTime () {   .......   ....... } int main (void) {    while (1)     {           ...           SetTime ();         }          }



в таком стиле как она написана счас нужны ли ей хидеры с прототипами функций ?
или же, если я вас правильно понял, хидер с прототипами функций будет нужен тогда когда ф-ции SetScreen (char raz1_2, char raz3_4, char d) и SetTime () будут описаны после ГЛАВНОЙ функции ?

Содержимое поста отредактировано: FreshMan, в: 14.12.2012 20:05
Experience is the name everyone give to his mistakes.
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7903
ARV (Администратор)
Администратор
Постов: 2386
graph
В ответ на: Модульная программа 14.12.2012 21:34 Репутация: 176  
вы поняли правильно. при этом SetScreen не может использовать внутри себя SetTime. в вашем случае хидер с прототипами не нужен. кстати, в одномодульной программе прототипы можно делать прямо в основном файле без отдельного хидера.
Не стыдно не знать, стыдно не учиться
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
_GEN_GOTOTOP Ответить
© Copyright 2007 Best of Joomla, Работает на FireBoardполучить последние сообщения прямо на Ваш рабочий стол