Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 10.12.2009, 18:47  
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию С арифмметика. Запутался приведениях типов

Доброго.
Есть макрос, который генерит значение байта для 7-сегментного индикатора.
Код:
// Это уже результат его работы
buf = ((~((0‹‹0)|(0‹‹1)|(0‹‹2)|(0‹‹3)|(0‹‹4)|(0‹‹5)|(1‹‹6)|(0‹‹7))));
Пока всё работает отлично.
Теперь мне нужно 4 таких байта запихнуть в "видеопамять" unsigned long
В голове выстраивается примерно такое:
Код:
#define screen_code(a,b,c,d)  ((a‹‹24)+(b‹‹16)+(c‹‹8)+d)
И тут начинается капут. "out of range"

Доупрощал до такого куска и туплю ... как компилятор заставить собрать правильно четыре байта в длинное целое?
Код:
//ZG7_minus дает строку с примера выше (buf)

// ТУТ ВСЁ РАБОТАЕТ
  #define screen_code(a,b,c,d)  ((a‹‹24)|(b‹‹16)|(c‹‹8)|d)  
  #define SCREEN_MINUS          screen_code(255,255,255,255)

//ТУТ ПОЛУЧИЛОСЬ ЗАСТАВИТЬ РАБОТАТЬ С ПРИВЕДЕНИЕМ ТИПА
  #define screen_code(a,b,c,d)  ((a‹‹24)|(b‹‹16)|(c‹‹8)|(unsigned char)d)  
  #define SCREEN_MINUS          screen_code(255,255,255,ZG7_minus)

//А ТУТ УЖЕ НЕТ - переполнение и полный бред
  #define screen_code(a,b,c,d)  ((a‹‹24)|(b‹‹16)|(c‹‹8)|(unsigned char)d)  
  #define SCREEN_MINUS          screen_code(255,255,ZG7_minus,ZG7_minus)
Реклама:
AndryG вне форума  
Непрочитано 10.12.2009, 18:59  
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию Re: С арифмметика. Запутался приведениях типов

Научный тык показал, что при отключении инвентирования (убрать ~ в начале макроса) всё начинает работать. Как же быть!?
AndryG вне форума  
Непрочитано 10.12.2009, 19:19  
testerplus
Прописка
 
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
testerplus на пути к лучшему
По умолчанию Re: С арифмметика. Запутался приведениях типов

Здесь ответ
testerplus вне форума  
Непрочитано 10.12.2009, 21:56  
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию Re: С арифмметика. Запутался приведениях типов

Ответ находится в приложении "преобразования типов" у К&R.

((~((0‹‹0)|(0‹‹1)|(0‹‹2)|(0‹‹3)|(0‹‹4)|(0‹‹5)|(1‹‹ 6)|(0‹‹7))))

Если убрать "~", то всё начинает работать, ибо тип результата будет char, который благополучно потом сдвигается на свое место.

При добавлении "~", результат этой строки расширяется до unsigned long и мы получаем проблему при сдвиге.

Но почему происходит расширение типа?! Ведь операнд у ~ один и не длинное целое.

Принудительное приведение типа решило проблему:
//Макрос "сборки" байта знакогенератора из определдений "бит-сегмент" и "полярность поджига" (1/0-зажечь/потушить).

#define ZG7_compile(xA,xB,xC,xD,xE,xF,xG,xP) ((unsigned char)(ZG7_inv((unsigned char)((xA‹‹ZG7_A)|(xB‹‹ZG7_B)|(xC‹‹ZG7_C)|(xD‹‹ZG7_D)|( xE‹‹ZG7_E)|(xF‹‹ZG7_F)|(xG‹‹ZG7_G)|(xP‹‹ZG7_P)))))
AndryG вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 12:24.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot