| 
			| 
					
						| 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-порт. Для этого есть буфер  Как передать данные из структуры в этот буфер? |  
						| 
								|  |  
								| « Последнее редактирование: 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++ » |  Записан | 
 |  |  | 
	|  |