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)
|
|
« Ответ #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
Главный специалист
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
Помогающий
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 » |
|
То есть приведенные коды не подходят Интересно, каких результатов ты ожидаешь? Что пошлются 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
Помогающий
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 » |
|
Во первых: вместо 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++ »
|
Записан
|
|
|
|
|