Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CodeVisionAVR работа со структурами
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Станис
создал структуру:
struct in {
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
}ww;
b0-b7 - биты
присвоил значения:
ww.b0=1;
ww.b1=1;
ww.b2=1;
ww.b3=0;
ww.b4=0;
ww.b5=1;
ww.b6=1;
ww.b7=0;

скажите, пожалуйста, как теперь значение структуры присвоить переменной unsigned char in;
т.е. должна in==0b11100110
ReAl
Дежавю како-то...
Ну про union понятно, если CodeVision их не жрёт, то тогда так поробуйте
Код
    in = *(unsigned char*)&ww;
что ещё более некрасиво, чем через union, но должно работать.
Станис
Цитата(ReAl @ Nov 22 2010, 23:48) *
Дежавю како-то...
Ну про union понятно, если CodeVision их не жрёт, то тогда так поробуйте
Код
    in = *(unsigned char*)&ww;
что ещё более некрасиво, чем через union, но должно работать.

УРАААА!!!!!!!!
это просто щастье какоето, все работает!!!!
Спасибо огромное!!!!!
alexeyv
я обычно делал так:
Код
typedef union Type____{
unsigned char ch;
struct{
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
};
}my_type;
.........
my_type a;
unsigned char c;
.........
a.b0 = 1;
a.b4 = 0;
...........
a.ch = c;
...........


И никаких преобразований, засоряющих код!
WHALE
Цитата(ReAl @ Nov 22 2010, 20:48) *
Дежавю како-то...
Ну про union понятно, если CodeVision их не жрёт, то тогда так поробуйте
Код
    in = *(unsigned char*)&ww;
что ещё более некрасиво, чем через union, но должно работать.

Все он ест.Попробуйте через юнион.
SasaVitebsk
Цитата(alexeyv @ Nov 23 2010, 07:49) *
И никаких преобразований, засоряющих код!

smile.gif

а что с указателями будут преобразования? Тем более засоряющие код.
Я предпочитаю работать с указателями. По крайней мере сразу видно куда ты обращаешься.
ReAl
Цитата(WHALE @ Nov 23 2010, 07:45) *
Все он ест.Попробуйте через юнион.
Я не знаю, умеет CodeVision работать с union или нет.
Но на этот же вопрос на радиокоте я парой часов раньше, чем тут, ответил как раз с union (причём дал два варианта кода -— со всеми именованными полями и, с оговоркой, что не везде идёт, с безымянной структурой).
Вопрошавший сказал, что CodeVision ругается Тогда я тут предложил уже через указатель.
alexeyv
Цитата
а что с указателями будут преобразования? Тем более засоряющие код.


a.ch = c;

гораздо короче чем

in = *(unsigned char*)&ww;
sch
Не буду создавать новую тему.
Какая-то фигня в codevision со структурами. Поднял давнишний проект, написанный в версии 1.25.5. Надо немного исправить его, ну думаю сделаю в версии 2.05.
Задал 2 безымянных структуры:
Код
eeprom struct {                                        
               unsigned char cc_l[3],            
                             cc_r[3],              
                             cc_low,                  
                             pc_l[4],                
                             pc_r[4],                
                             pc_low;                  
              } ecommand;    

flash struct {                                          // дефолтные значения
               unsigned char cc_l[3],                  
                             cc_r[3],                  
                             cc_low,                  
                             pc_l[4],                  
                             pc_r[4],                  
                             pc_low;                  
              } fcommand

так вот в версии 1.25 строка типа ecommand = fcommand; корректно присваивает все значения всем переменным структуры, а в версии 2.05 - ругается и не компилируется. Почему?
maksimp
Цитата(sch @ Dec 15 2011, 05:04) *
Задал 2 безымянных структуры:
так вот в версии 1.25 строка типа ecommand = fcommand; корректно присваивает

Странно что работает с безымянными структурами.

А так будет работать?
Код
struct X {                                        
               unsigned char cc_l[3],            
                             cc_r[3],              
                             cc_low,                  
                             pc_l[4],                
                             pc_r[4],                
                             pc_low;                  
              };    

eeprom X ecommand;    
flash X fcommand;

sch
Цитата(maksimp @ Dec 15 2011, 08:56) *
Странно что работает с безымянными структурами.

А так будет работать?

А что странного?
Разобрался, так как вы привели не работает, зато заработало вот так:
Код
struct X {                                        
               unsigned char cc_l[3],            
                             cc_r[3],              
                             cc_low,                  
                             pc_l[4],                
                             pc_r[4],                
                             pc_low;                  
              };    

struct X eeprom ecommand;    
struct X flash fcommand;

Спасибо за наводку.

Кстати, никакого уменьшения объема кода не заметил: в старой версии codevision прошивка была 3031 слов, в новой 2.05, с учетом вышеприведенных исправлений - 3061 слово.
Сергей Борщ
QUOTE (sch @ Dec 15 2011, 04:04) *
ругается и не компилируется. Почему?

QUOTE (sch @ Dec 15 2011, 05:49) *
Разобрался


Вы наблюдаете эффект "телепаты в отпуске". Если бы вы привели текст ошибки, то, возможно, кто-то и попытался бы помочь. А так нашелся лишь один рискнувный тыкать пальцем в небо.
maksimp
Цитата(sch @ Dec 15 2011, 06:49) *
А что странного?

Вроде структуры с одинаковым содержимым не считаются принадлежащими к одному типу, если по разному называются. Вот пример из Windows:

В winnt.h
Код
#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n

В windef.h
Код
DECLARE_HANDLE(HBITMAP);
DECLARE_HANDLE(HBRUSH);

И HBITMAP и HBRUSH - указатели на структуры их одного целого числа, но присваивать их друг другу нельзя. Специально для этого это всё и накручено.

sch
Цитата(Сергей Борщ @ Dec 15 2011, 13:38) *
Вы наблюдаете эффект "телепаты в отпуске". Если бы вы привели текст ошибки, то, возможно, кто-то и попытался бы помочь. А так нашелся лишь один рискнувный тыкать пальцем в небо.

Вообще не понимаю зачем вы это написали. Этот рискнувший мне и помог, ну маленько с синтаксисом попутал, но в целом его мысль была правильная. Я наверное не зря написал в разделе "в помощь начинающему", не очень-то я знаю Си и некоторые особенности, а тут напортачил очевидно, да еще и помог баг codevision старой версии (я думаю это все-таки баг). Так что еще раз спасибо maksimp
Сергей Борщ
QUOTE (sch @ Dec 15 2011, 13:20) *
Вообще не понимаю зачем вы это написали. Этот рискнувший мне и помог, ну маленько с синтаксисом попутал, но в целом его мысль была правильная.
Затем, что если вы хотите получить быстрый и по возможности правильный ответ - приводите максимум информации. Вы поленились скопировать текст ошибки в свое сообщение, а многие, кто мог бы по нему дать вам ответ поленились перечислять возможные варианты. Т.е. не надо удивляться, что ответ был только один, да и тот случайный.
sch
Цитата(Сергей Борщ @ Dec 15 2011, 20:35) *
Вы поленились скопировать текст ошибки в свое сообщение

Не поленились, а не додумались. Впредь учтем.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.