|
CodeVisionAVR работа со структурами |
|
|
|
Nov 22 2010, 17:48
|

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

|
Дежавю како-то... Ну про union понятно, если CodeVision их не жрёт, то тогда так поробуйте Код in = *(unsigned char*)&ww; что ещё более некрасиво, чем через union, но должно работать.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Nov 22 2010, 17:59
|
Частый гость
 
Группа: Участник
Сообщений: 128
Регистрация: 12-11-09
Из: Perm
Пользователь №: 53 565

|
Цитата(ReAl @ Nov 22 2010, 23:48)  Дежавю како-то... Ну про union понятно, если CodeVision их не жрёт, то тогда так поробуйте Код in = *(unsigned char*)&ww; что ещё более некрасиво, чем через union, но должно работать. УРАААА!!!!!!!! это просто щастье какоето, все работает!!!! Спасибо огромное!!!!!
|
|
|
|
|
Nov 23 2010, 03:49
|
Местный
  
Группа: Участник
Сообщений: 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; ........... И никаких преобразований, засоряющих код!
|
|
|
|
|
Nov 23 2010, 05:45
|

Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
Nov 23 2010, 09:21
|

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

|
Цитата(WHALE @ Nov 23 2010, 07:45)  Все он ест.Попробуйте через юнион. Я не знаю, умеет CodeVision работать с union или нет. Но на этот же вопрос на радиокоте я парой часов раньше, чем тут, ответил как раз с union (причём дал два варианта кода -— со всеми именованными полями и, с оговоркой, что не везде идёт, с безымянной структурой). Вопрошавший сказал, что CodeVision ругается Тогда я тут предложил уже через указатель.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Nov 24 2010, 03:50
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Цитата а что с указателями будут преобразования? Тем более засоряющие код. a.ch = c; гораздо короче чем in = *(unsigned char*)&ww;
|
|
|
|
|
Dec 15 2011, 02:04
|
Частый гость
 
Группа: Участник
Сообщений: 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 - ругается и не компилируется. Почему?
|
|
|
|
|
Dec 15 2011, 02:56
|
Местный
  
Группа: Участник
Сообщений: 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;
|
|
|
|
|
Dec 15 2011, 03:49
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 15 2011, 07:38
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Dec 15 2011, 10:40
|
Местный
  
Группа: Участник
Сообщений: 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 - указатели на структуры их одного целого числа, но присваивать их друг другу нельзя. Специально для этого это всё и накручено.
|
|
|
|
|
Dec 15 2011, 11:20
|
Частый гость
 
Группа: Участник
Сообщений: 165
Регистрация: 12-08-08
Из: Омск
Пользователь №: 39 557

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

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|