![]() |
|
Модераторы: bsa |
![]()
|
|
| SERGSERG |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.5.2005 Репутация: нет Всего: нет |
всем привет!
Программирую контроллеры на Си. Решил привести прогу в порядок - разбить на несколько *.с и *.h файлов. Проблема заключается в том, что большинство *.с файлов обращаются к переменным, которые находятся в UNION. Каким образом мне правильно объявить union как extern, чтоб иметь доступ к переменным union? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
о каком unione речь ? о переменной или о типе ? переменная юнион опредяляется подбно обычной, а описание типа должно быть доступно на момент использования, т.е. включение необходимо и _эксренном_ это не делается.. |
|||
|
||||
| Peter |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 28.7.2003 Где: Ставрополь Репутация: нет Всего: 1 |
Код примерно такой (компилятором не проверяю, проверьте сами).
common.h
1.c
2.c
Файлы 1.c и 2.c объединяем в проект. Объявление extern U u; из common.h видно везде, так что об u знают все файлы. -------------------- всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23). |
||||||
|
|||||||
| SERGSERG |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.5.2005 Репутация: нет Всего: нет |
Снова привет!
Предложенный вариант работает. Спасибо! Но есть проблема, когда в unionе присутствует struct то компилятор выдаёт ошибку. Подскажите как победить? Пример UNION union _paket { unsigned char can_tx_tmp[]; struct { ........................... }; }; extern union _paket paket; |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
а мы должны догадаться какую ? у вас во первых массив переменного размера, во вторых нет имени поля, для которого описана структура, ну и сама структура безымянна (последнее не так страшно) |
|||
|
||||
| SERGSERG |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.5.2005 Репутация: нет Всего: нет |
Всем спасибо вроде разобрались что к чему.
В итоге получилось так, компилятор ошибки не выдаёт. Но интересует на сколько правильно (грамотно) это всё объявлено в 1.h
в 1.с
в 2.с
Модератор: Не забываем пользоваться кнопочкой "Код" Это сообщение отредактировал(а) bsa - 30.7.2010, 10:08 |
||||||
|
|||||||
| Peter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 28.7.2003 Где: Ставрополь Репутация: нет Всего: 1 |
Ничего подозрительного/плохого в коде не увидел.
-------------------- всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23). |
|||
|
||||
| SERGSERG |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.5.2005 Репутация: нет Всего: нет |
Отлично
Но Си "гибкий" язык. Думаю, что можно решить данную задачу в нескольких вариантах. Какие варианты возможны? Зы. Интересно для себя изучить что и как, на Си не много программирую, а такие "узкие" задачи не в каждой книжке описаны Это сообщение отредактировал(а) SERGSERG - 30.7.2010, 18:36 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну так задача то где ? вариантов для предположений валом ) если насчет юниона, то его использование желательно сузить область его применения.. для приведенной части кода, надобность в юнионе не ясна.. достаточно обычной конверсии в массив. |
|||
|
||||
| SERGSERG |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.5.2005 Репутация: нет Всего: нет |
Сори... долго не отвечал
Всем спасибо за ответ! Ваш вопрос понятен. Данный мною пример немного не корректен. В структуре размещены переменные различных типов, есть как 8-ми битные, так и 1 (флаги), 2, 3-битные переменные. Union необходим для более простого программного обращения к элементам структуры (имеющие различную разрядность), а для передачи по последовательному протоколу удобней использовать массив с 8-ми разрядными переменными - массив can_tx_tmp[10]. В этом то и интерес...может можно "красивей" сделать? Или красивее некуда? ЗЫ: На С недолго программирую, решил спросить у профи, на сколько грамотный мой подход Это сообщение отредактировал(а) SERGSERG - 13.8.2010, 21:37 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |