реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> CodeVisionAVR работа со структурами
Станис
сообщение Nov 22 2010, 16:48
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 12-11-09
Из: Perm
Пользователь №: 53 565



создал структуру:
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
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 22 2010, 17:48
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Дежавю како-то...
Ну про union понятно, если CodeVision их не жрёт, то тогда так поробуйте
Код
    in = *(unsigned char*)&ww;
что ещё более некрасиво, чем через union, но должно работать.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Станис
сообщение Nov 22 2010, 17:59
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 12-11-09
Из: Perm
Пользователь №: 53 565



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

УРАААА!!!!!!!!
это просто щастье какоето, все работает!!!!
Спасибо огромное!!!!!
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Nov 23 2010, 03:49
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



я обычно делал так:
Код
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;
...........


И никаких преобразований, засоряющих код!
Go to the top of the page
 
+Quote Post
WHALE
сообщение Nov 23 2010, 05:45
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



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

Все он ест.Попробуйте через юнион.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Nov 23 2010, 06:34
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

smile.gif

а что с указателями будут преобразования? Тем более засоряющие код.
Я предпочитаю работать с указателями. По крайней мере сразу видно куда ты обращаешься.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 23 2010, 09:21
Сообщение #7


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Nov 24 2010, 03:50
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
а что с указателями будут преобразования? Тем более засоряющие код.


a.ch = c;

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

in = *(unsigned char*)&ww;
Go to the top of the page
 
+Quote Post
sch
сообщение Dec 15 2011, 02:04
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 165
Регистрация: 12-08-08
Из: Омск
Пользователь №: 39 557



Не буду создавать новую тему.
Какая-то фигня в 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 - ругается и не компилируется. Почему?
Go to the top of the page
 
+Quote Post
maksimp
сообщение Dec 15 2011, 02:56
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(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;

Go to the top of the page
 
+Quote Post
sch
сообщение Dec 15 2011, 03:49
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 165
Регистрация: 12-08-08
Из: Омск
Пользователь №: 39 557



Цитата(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 слово.

Сообщение отредактировал sch - Dec 15 2011, 11:22
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 15 2011, 07:38
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (sch @ Dec 15 2011, 04:04) *
ругается и не компилируется. Почему?

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


Вы наблюдаете эффект "телепаты в отпуске". Если бы вы привели текст ошибки, то, возможно, кто-то и попытался бы помочь. А так нашелся лишь один рискнувный тыкать пальцем в небо.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
maksimp
сообщение Dec 15 2011, 10:40
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(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 - указатели на структуры их одного целого числа, но присваивать их друг другу нельзя. Специально для этого это всё и накручено.

Go to the top of the page
 
+Quote Post
sch
сообщение Dec 15 2011, 11:20
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 165
Регистрация: 12-08-08
Из: Омск
Пользователь №: 39 557



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

Вообще не понимаю зачем вы это написали. Этот рискнувший мне и помог, ну маленько с синтаксисом попутал, но в целом его мысль была правильная. Я наверное не зря написал в разделе "в помощь начинающему", не очень-то я знаю Си и некоторые особенности, а тут напортачил очевидно, да еще и помог баг codevision старой версии (я думаю это все-таки баг). Так что еще раз спасибо maksimp
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 15 2011, 14:35
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01522 секунд с 7
ELECTRONIX ©2004-2016