Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> extern union на Си, доступ к union от нескольких *.с 
:(
    Опции темы
SERGSERG
Дата 23.7.2010, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 4.5.2005

Репутация: нет
Всего: нет



всем привет! smile 
Программирую контроллеры на Си. Решил привести прогу в порядок - разбить на несколько *.с  и  *.h файлов.
Проблема заключается в том, что большинство *.с файлов обращаются к переменным, которые находятся в UNION.
Каким образом мне правильно объявить union как extern, чтоб иметь доступ к переменным union?
PM MAIL   Вверх
mes
Дата 23.7.2010, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SERGSERG @  23.7.2010,  13:17 Найти цитируемый пост)
Каким образом мне правильно объявить union как extern

о каком unione речь ? о переменной или о  типе ? 
переменная юнион опредяляется подбно обычной,
 а описание типа должно быть доступно на момент использования, т.е. включение необходимо и _эксренном_ это не делается..



--------------------
PM MAIL WWW   Вверх
Peter
Дата 23.7.2010, 18:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



Код примерно такой (компилятором не проверяю, проверьте сами).
common.h
Код
union U
{ <куча полей>
};

extern U u;

1.c
Код
#include "common.h"

U u; // в 1.c объявляем объект

// дальше можем его использовать

2.c
Код
#include "common.h"

// используем u

Файлы 1.c и 2.c объединяем в проект.
Объявление extern U u; из common.h видно везде, так что об u знают все файлы.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
SERGSERG
Дата 27.7.2010, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 4.5.2005

Репутация: нет
Всего: нет



Снова привет!
Предложенный вариант работает. Спасибо! smile 
Но есть проблема, когда в unionе присутствует struct то компилятор выдаёт ошибку. Подскажите как победить? smile 

Пример UNION

union _paket
    {
    unsigned char can_tx_tmp[];  

        struct
        {
           ........................... 
        };
    };   


extern union _paket paket; 

PM MAIL   Вверх
mes
Дата 27.7.2010, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SERGSERG @  27.7.2010,  06:14 Найти цитируемый пост)
о есть проблема, когда в unionе присутствует struct то компилятор выдаёт ошибку. Подскажите как победить?  

а мы должны догадаться какую ? 

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



--------------------
PM MAIL WWW   Вверх
SERGSERG
Дата 30.7.2010, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 4.5.2005

Репутация: нет
Всего: нет



Всем спасибо вроде разобрались что к чему.
В итоге получилось так, компилятор ошибки не выдаёт. Но интересует на сколько правильно (грамотно) это всё объявлено smile 

в 1.h
Код
union _paket
    {
    unsigned char can_tx_tmp[10];   

        struct 
        {
            unsigned char nomer_plat:8;    //номер платы = номеру идентификатора (в идентификаторе) 
            //..................................
            //..................................
            unsigned char nomer_paketa:8;    //номер передаваемого пакета (в идентификаторе) 
            
            
        }paket_tx;
    };   


extern union _paket paket; 


в 1.с
Код
union _paket paket;
//..............................


в 2.с
Код
paket.paket_tx.nomer_paketa=10;
//.............................



Модератор: Не забываем пользоваться кнопочкой "Код"

Это сообщение отредактировал(а) bsa - 30.7.2010, 10:08
PM MAIL   Вверх
Peter
Дата 30.7.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



Ничего подозрительного/плохого в коде не увидел.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
SERGSERG
Дата 30.7.2010, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 4.5.2005

Репутация: нет
Всего: нет



Отлично  smile .
 Но Си "гибкий" язык. Думаю, что можно решить данную задачу в нескольких вариантах. Какие варианты возможны?
 
Зы. Интересно для себя изучить что и как, на Си не много программирую, а такие "узкие" задачи не в каждой книжке описаны smile 

Это сообщение отредактировал(а) SERGSERG - 30.7.2010, 18:36
PM MAIL   Вверх
mes
Дата 30.7.2010, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SERGSERG @  30.7.2010,  17:07 Найти цитируемый пост)
Думаю, что можно решить данную задачу в нескольких вариантах. Какие варианты возможны?

ну так задача то где ? вариантов для предположений валом )

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



--------------------
PM MAIL WWW   Вверх
SERGSERG
Дата 13.8.2010, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 4.5.2005

Репутация: нет
Всего: нет



Сори... долго не отвечал smile
Всем спасибо за ответ!
Ваш вопрос понятен. 
Данный мною пример немного не корректен. В структуре размещены переменные различных типов, есть как 8-ми битные, так и 1 (флаги), 2, 3-битные переменные. 
Union необходим для более простого программного обращения к элементам структуры (имеющие различную разрядность), а для передачи по последовательному протоколу удобней использовать массив с 8-ми разрядными переменными - массив can_tx_tmp[10]. 
В этом то и интерес...может можно "красивей" сделать?
Или красивее некуда? smile 

ЗЫ: На С недолго программирую, решил спросить у профи, на сколько грамотный мой подход smile  


Это сообщение отредактировал(а) SERGSERG - 13.8.2010, 21:37
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.