ann_nef
|
|
« : 09-06-2010 11:36 » |
|
Вот эта часть:
unsigned int kom,*zkom; unsigned char buf[4]; buf[1]=0x83; buf[2]=2; (unsigned char*)zkom = &buf[1]; kom = *zkom;
В Borland всё ОК.(результат: kom=0х283)
А в Visual С++ выдаётся ошибка error C2106: '=' : left operand must be l-value на 5 строчку. Как написать так, чтобы получить тот же результат?
Можно корявенько kom = ((buf[2]<<8)&0xff00) | (buf[1]&0xff);
А вы как бы написали?
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #1 : 09-06-2010 12:07 » |
|
какая задача?
|
|
|
Записан
|
Странно всё это....
|
|
|
ann_nef
|
|
« Ответ #2 : 09-06-2010 13:12 » |
|
Чтение двух байтов в переменную kom, причём младший байт - в buf[1], старший во buf[2]. Так понятней?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #3 : 09-06-2010 13:15 » |
|
И правильно ругается: C-cast возвращает l-value только для ссылок. Походу, Borland или очень старый, или им положить на стандарт. Ну, например, union X { unsigned int x; unsigned char buf[4]; };
X x; x.buf[1] = 0x83; x.buf[2] = 2;
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #4 : 09-06-2010 13:52 » |
|
По умолчанию в проекте в разделе совместимости C++ стоит Borland, но можно и переключить на ANSI (правда, тогда штатные библиотеки можно выкинуть).
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
ann_nef
|
|
« Ответ #5 : 10-06-2010 07:15 » |
|
Да, переписываю древнюю программу, там на каждом шагу либо запихивается два байта,принятые от прибора, в переменную int, либо наоборот из int распихивается инфа по двум байтам для передачи прибору( младший вперед, потом старший). Спасибо за помощь. Буду корявеньким своим способом пользоваться, он работает. Хотелось красоты.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 10-06-2010 08:28 » |
|
#pragma pack(push,1) struct s_kom { BYTE b1; BYTE b2; }; #pragma pack(pop)
s_kom kom; kom.b1=buf[1]; kom.b2=buf[2];
а так красиво ? )
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #7 : 10-06-2010 08:39 » |
|
Алексей1153++, ничего красивого reinterpret_cast и то не хуже, имхо
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 10-06-2010 08:46 » |
|
мне не нравится *_cast , если честно - вообще не понимаю, зачем его использовать ) Всё и так хорошо делается, если думать
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #9 : 10-06-2010 09:15 » |
|
kom = buf[2]; kom = kom << 8 | buf[1]
|
|
« Последнее редактирование: 10-06-2010 09:22 от Антон »
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 10-06-2010 09:16 » |
|
Антон, логичнее всё-таки с | , а не с +
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #11 : 10-06-2010 09:22 » |
|
поправил
|
|
|
Записан
|
Странно всё это....
|
|
|
ann_nef
|
|
« Ответ #12 : 10-06-2010 11:07 » |
|
Ну да, тот же вариант, как у меня kom= ((buf[2]<<8)& 0xff00) | (buf[1]& 0xff);(см.в-с) или, если не перестраховываться kom = (buf[2]<<8) | buf[1];
|
|
« Последнее редактирование: 10-06-2010 12:46 от Sla »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #13 : 10-06-2010 12:48 » |
|
ann_nef, отчего страхуешься? Offtopic: Это мне напомнило про чукчей и презервативы
Поставлю в угол.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
ann_nef
|
|
« Ответ #14 : 10-06-2010 13:14 » |
|
Sla, от собственной тени.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 10-06-2010 14:31 » |
|
ann_nef, C++ не делает циклические сдвиги, поэтому если предполагается вдвиг битов "из пустоты", то они будут нулевые
|
|
|
Записан
|
|
|
|
|