Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача данных из структуры в буфер char x[12]  (Прочитано 7990 раз)
0 Пользователей и 1 Гость смотрят эту тему.
FoxVID
Гость
« : 04-12-2003 08:02 » 

Есть структура:
Код:
typedef struct
{
   unsigned char Dlina:1;
   unsigned char CodOp:1;
   DWORD NrMas:4;
   unsigned char NrPack:1;
   DWORD CsNr:4;
} OpnCs;
Присваиваю всем данные:
Код:
OpnCs->Dlina=11;
OpnCs->CodOp=128;
OpnCs->NrMas=2052314;
OpnCs->NrPack=1;
OpnCs->CsNr=1231;
Далее эти данные необходимо передать в Com-порт. Для этого есть буфер
Код:
char buff[12]
Как передать данные из структуры в этот буфер?
« Последнее редактирование: 23-11-2007 14:56 от Алексей1153++ » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 04-12-2003 08:10 » 

Можно просто. Скопировать как нибуть так:
Код:
for (int i=0;i<12;i++) buff[i] = (char *) OpnCs;

или без звёздочки?   Вот такой я вот
Или буфер указатель на структуру.
Или передавать элементы структуры по отдельности замеряю из рамер sizeof так ты избежишь лишних байт от выравнивания памяти.
« Последнее редактирование: 23-11-2007 14:57 от Алексей1153++ » Записан

Странно всё это....
GlukSoft
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 04-12-2003 08:18 » 

Код:
char *pc;
pc = (char *) OpnCs;
for (int i = 0; i < 12; i++)
buff[i] = pc[i];

или
Код:
memcpy(&buff, &OpnCs, sizeof(char) * 12);
« Последнее редактирование: 23-11-2007 14:58 от Алексей1153++ » Записан

Fatal error C1: Brain expected
FoxVID
Гость
« Ответ #3 : 04-12-2003 08:29 » 

Цитата

Или передавать элементы структуры по отдельности замеряю из рамер sizeof так ты избежишь лишних байт от выравнивания памяти.

В том то и дело, что я не знаю как передать элементы структуры по отдельности... Жаль
Записан
NetRaider
Гость
« Ответ #4 : 04-12-2003 08:31 » 

Вариант 1(так как данная структура является POD. При объявлении структуры необходимо использовать #pragma pack(push, 1) ):

Код:
OpnCs cs;
char buf[sizeof(OpnCs)];
memcpy((void*)buf, (const void*)&cs, sizeof(OpnCs));

Вариант 2(несовсем легален, но широко используется в winapi):

Код:
#pragma pack(push, 1)
union OpnCs
{
    struct OpnCs_
    {
        unsigned char Dlina:1;
        unsigned char CodOp:1;
        DWORD NrMas:4;
        unsigned char NrPack:1;
        DWORD CsNr:4;
    } cs_;

    char buf_[sizeof(OpnCs_)];
};
#pragma pack(pop)

....

OpnCs a;

a.cs_.Dlina=11;
a.cs_.CodOp=128;
a.cs_.NrMas=2052314;
a.cs_.NrPack=1;
a.cs_.CsNr=1231;
// после этого a.buf_ содержит данные
« Последнее редактирование: 23-11-2007 14:59 от Алексей1153++ » Записан
FoxVID
Гость
« Ответ #5 : 04-12-2003 08:46 » 

Цитата
Код:
for (int i=0;i<12;i++) buff[i] = (char) OpnCs;
Результат работы
1C1C 1C1C 1C1C 1C1C 1C1C 1C1C 00

Цитата
Код:
char *pc;
pc = (char *) OpnCs;
for (int i = 0; i < 12; i++)
buff[i] = pc[i];
Результат работы
0C67 6832 0A67 6832 0F00 0000 00
Здесь уже правильно передается 1-й байт

Цитата
Код:
memcpy(&buff, &OpnCs, sizeof(char) * 12);
Результат работы
1C55 BC00 1600 0000 0000 0000 00

То есть приведенные коды не подходят Жаль
« Последнее редактирование: 23-11-2007 15:00 от Алексей1153++ » Записан
NetRaider
Гость
« Ответ #6 : 04-12-2003 08:48 » 

У тебя размер структуры не 12 байт.  Поставь #pragma pack(push, 1).
Записан
Migmile
Помогающий

ru
Offline Offline

« Ответ #7 : 04-12-2003 08:51 » 

"несовсем легален, но широко используется в winapi): "
Он легален, если на том конце приемника тот же язык, компилятор и ОП Отлично
Записан
FoxVID
Гость
« Ответ #8 : 04-12-2003 09:08 » 

Цитата

У тебя размер структуры не 12 байт. Поставь #pragma pack(push, 1).

Поставил. В результате размер структуры 4 байта. На выходе получаю
0B0A 010F 7C42 0C01 341A 0C01 00
То есть первый байт правильный, а дальше ... :?:
Записан
NeilPryde
Гость
« Ответ #9 : 04-12-2003 09:21 » 

Цитата: FoxVID
То есть приведенные коды не подходят Жаль

Интересно, каких результатов ты ожидаешь? Что пошлются 11, 128, 2052314, 1, 1231? Так ведь это не верно! У тебя элементы структуры объявлены как битовые поля. Поэтому во всех твоих присваиваниях значений будут учитываться только 1 бит либо 4 бита. А что будет в старших битах одному Грому известно Улыбаюсь, а нам грешным знать этого не дано!
« Последнее редактирование: 23-11-2007 15:02 от Алексей1153++ » Записан
FoxVID
Гость
« Ответ #10 : 04-12-2003 09:30 » 

Цитата

Что пошлются 11, 128, 2052314, 1, 1231? Так ведь это не верно! У тебя элементы структуры объявлены как битовые поля. Поэтому во всех твоих присваиваниях значений будут только 1 бит либо 4.

Все понял.  Жжешь Я их просто-напросто неверно определил. Убрал битовость - все пошло.
Всем большое спасибо!!!
 Отлично
Записан
Migmile
Помогающий

ru
Offline Offline

« Ответ #11 : 04-12-2003 10:20 » 

Во первых: вместо 12 ВСЕГДА лучше использовать sizeof(struct ....). Я стараюсь везде писать даже sizeof(int), т.к. никогда не знаешь, под какую разрадность тебя занесет Отлично
Во вторых: если не обосновано другими причинами, БЫСТРЕЕ (, соответственно, и лучше!) использовать memcpy (или аналогичное), ососбенно, если это стоит в процедуре обработки прерывания (например в COM isr)
Записан
Kern
Гость
« Ответ #12 : 04-12-2003 13:03 » 

Еще быстрее использовать union - так как операция копирования сама по себе отсутствует Улыбаюсь
Записан
NeilPryde
Гость
« Ответ #13 : 19-01-2004 12:41 » 

Цитата: Migmile
Во первых: вместо 12 ВСЕГДА лучше использовать sizeof(struct ....). Я стараюсь везде писать даже sizeof(int), т.к. никогда не знаешь, под какую разрадность тебя занесет Отлично


К сожалению, и это не всегда помогает. Например, в некоторых DSP, sizeof(int) = sizeof(short) = sizeof(char) = 16 бит.
Записан
ixania
Гость
« Ответ #14 : 19-01-2004 20:41 » 

Цитата: Николай
memcpy(&buff, &OpnCs, sizeof(char) * 12);

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

memmove(buff, &OpnCs, sizeof(OpnCs) );
« Последнее редактирование: 23-11-2007 15:05 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines