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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка выдается в Visual C++ , а в Borland C++ нет.  (Прочитано 12165 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« : 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)
Глобальный модератор

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


WWW
« Ответ #1 : 09-06-2010 12:07 » 

какая задача?
Записан

Странно всё это....
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #2 : 09-06-2010 13:12 » 

Чтение двух байтов в переменную kom, причём младший байт - в buf[1], старший во buf[2].
Так понятней?
Записан
Вад
Команда клуба

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

« Ответ #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
Технический
Администратор

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

WWW
« Ответ #4 : 09-06-2010 13:52 » 

По умолчанию в проекте в разделе совместимости C++ стоит Borland, но можно и переключить на ANSI (правда, тогда штатные библиотеки можно выкинуть).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #5 : 10-06-2010 07:15 » 

Да, переписываю древнюю программу, там на каждом шагу либо запихивается два байта,принятые от прибора, в переменную int, либо наоборот из int распихивается инфа по двум байтам для передачи прибору( младший вперед, потом старший).
Спасибо за помощь.
Буду корявеньким своим способом пользоваться, он работает. Хотелось красоты.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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];
а так красиво ? )
Записан

Вад
Команда клуба

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

« Ответ #7 : 10-06-2010 08:39 » 

Алексей1153++, ничего красивого Улыбаюсь reinterpret_cast и то не хуже, имхо
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 10-06-2010 08:46 » 

мне не нравится *_cast  , если честно - вообще не понимаю, зачем его использовать ) Всё и так хорошо делается, если думать
Записан

Антон (LogRus)
Глобальный модератор

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


WWW
« Ответ #9 : 10-06-2010 09:15 » 

Код:
kom = buf[2];
kom = kom << 8 | buf[1]
« Последнее редактирование: 10-06-2010 09:22 от Антон » Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 10-06-2010 09:16 » 

Антон, логичнее всё-таки с | , а не с +
Записан

Антон (LogRus)
Глобальный модератор

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


WWW
« Ответ #11 : 10-06-2010 09:22 » 

Ага поправил
Записан

Странно всё это....
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #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
Модератор

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

WWW
« Ответ #13 : 10-06-2010 12:48 » 

ann_nef, отчего страхуешься?

Offtopic:

Это мне напомнило про чукчей и презервативы
Поставлю в угол.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #14 : 10-06-2010 13:14 » 

Sla, от собственной тени.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 10-06-2010 14:31 » 

ann_nef, C++ не делает циклические сдвиги, поэтому если предполагается вдвиг битов "из пустоты", то они будут нулевые
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines