Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

demiurg301, битовые операции я читал.........., ты лучше скажи толком откуда это число :tea:
Tell Me The Truth
Реклама
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

BCluster, я уже понял откуда это число :))
значит этому числу 01111000 мы присваиваем имя MASK_BUTTONS с помощью вот этой операции
#define MASK_BUTTONS ((1<<DOWN)|(1<<CANCEL)|(1<<UP)|(1<<ENTER))
так ????
Tell Me The Truth
Реклама
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

Плохо читал.

Код: Выделить всё

	

#define DOWN        3
#define CANCEL      4
#define UP              5
#define ENTER         6

Код: Выделить всё


#define MASK_BUTTONS       ((1<<DOWN)|(1<<CANCEL)|(1<<UP)|(1<<ENTER))

В данном контексте это все равно что написать 

#define MASK_BUTTONS       ((1<<3)|(1<<4)|(1<<5)|(1<<6))

На данном этапе понятно?
Если да, идем далее...

Код: Выделить всё

 ((1<<3)|(1<<4)|(1<<5)|(1<<6))
1 двигаем влево на 3 разряда. ЧТо получаем? 1000
на 4 раздяра - 10000
на 5 разрядов - 100000
на 6 разрядов - 1000000
потом выполняем битовое ИЛИ.
1000 ИЛИ 10000 ИЛИ 100000 ИЛИ 1000000 что получаем? 1111000
надеюсь так понятно
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

FreshMan писал(а):BCluster, я уже понял откуда это число :))
значит этому числу 01111000 мы присваиваем имя MASK_BUTTONS с помощью вот этой операции
#define MASK_BUTTONS ((1<<DOWN)|(1<<CANCEL)|(1<<UP)|(1<<ENTER))
так ????
Идея правильная но слово присвоить тут не годится )
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

а какое же слово тут уместней применять ?
Tell Me The Truth
Реклама
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

меня еще путает вот этот код

Код: Выделить всё

#define DOWN        3
#define CANCEL      4
#define UP              5
#define ENTER         6
насколько я понял то 3, 4, 5 и 6 это выводы порта А к которым подключены кнопки
ну а разве не правильней было бы написать

Код: Выделить всё

#define DOWN        PINA.3
#define CANCEL      PINA.4
#define UP              PINA.5
#define ENTER         PINA.6
ведь так логичнее будет.............., тут я явно узазываю какаму пину, какого порта какое присвоить имя......., а так как кампилятор поймет что значат цифры 3,4,5,и 6 ?????
Tell Me The Truth
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

FreshMan писал(а):а какое же слово тут уместней применять ?
ЗАМЕНЯЕМ:

с помощью вот этой операции
#define MASK_BUTTONS ((1<<DOWN)|(1<<CANCEL)|(1<<UP)|(1<<ENTER))
мы заменяем в тексте программы длинное ((1<<DOWN)|(1<<CANCEL)|(1<<UP)|(1<<ENTER)) коротким MASK_BUTTONS
битва с дураками проиграна, победители торжествуют. слава победителям!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

FreshMan писал(а):ну а разве не правильней было бы написать

Код: Выделить всё

#define DOWN        PINA.3
...
ведь так логичнее будет.............., тут я явно узазываю какаму пину, какого порта какое присвоить имя......., а так как кампилятор поймет что значат цифры 3,4,5,и 6 ?????
в языке Си нет такого PINA.3 - это происки и бредни CVAVR. нормальный компилятор не поймет как раз этой записи
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

Мастер Ломастер прав, это специфика CVAVR. В IAR тоже есть подобная запись, много где есть в общем ) Бредни бреднями, но удобно, однако не переносимо )
А та запись что приведена в вашем примере универсальна и будте работать в любом компиляторе )
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

Код: Выделить всё

#define INIT_Timer()        TIMSK = (1<<OCIE0);\
                                       TCCR0 = (1<<WGM01)|(0<<WGM00)|(1<<WGM00);\
                                       TCNT0 = 0;\
                                       OCR0 = 0x7d
а что тут понимать под OCIE0 WGM01 WGM00 WGM00 ???
пример взят отсюда http://chipenable.ru/index.php/programm ... efine.html
Tell Me The Truth
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

FreshMan писал(а):меня еще путает вот этот код

Код: Выделить всё

#define DOWN        3
#define CANCEL      4
#define UP              5
#define ENTER         6
насколько я понял то 3, 4, 5 и 6 это выводы порта А к которым подключены кнопки
ну а разве не правильней было бы написать

Код: Выделить всё

#define DOWN        PINA.3
#define CANCEL      PINA.4
#define UP              PINA.5
#define ENTER         PINA.6
ведь так логичнее будет.............., тут я явно узазываю какаму пину, какого порта какое присвоить имя......., а так как кампилятор поймет что значат цифры 3,4,5,и 6 ?????
так будет еще не логично, потому что более чем для pin эти дефайны уже не использовать.А есть еще и PORTx и DDRx

Код: Выделить всё

DDRx&=~(MASK_BUTTONS);
PORTx|=MASK_BUTTONS;

и это еще не все применения.:)
В поисках истины человек развивается.
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение sachok »

Помогите разобраться с avr-size. Компилирую элементарную программку, выдает

Код: Выделить всё

avr-size --format=avr --mcu=atmega8 irStation.elf
AVR Memory Usage
----------------
Device: atmega8

Program:    5902 bytes (72.0% Full)
(.text + .data + .bootloader)

Data:        280 bytes (27.3% Full)
(.data + .bss + .noinit)
flash получается .text + .data и это сдесь Program?
А Data это RAM?
Просто программа маленькая и 72% flash это как то много. Приложу исходник, попробуйте скомпилировать, на компьютере где работает avr-size.
P. S. оптимизация отключена
Вложения
main.c
(3.53 КБ) 206 скачиваний
Я не Сашок!!!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

sachok писал(а):flash получается .text + .data и это сдесь Program?
А Data это RAM?
Просто программа маленькая и 72% flash это как то много. Приложу исходник, попробуйте скомпилировать, на компьютере где работает avr-size.
P. S. оптимизация отключена
начну с конца: если оптимизация отключена, то фраза "Просто программа маленькая и 72% flash это как то много" попросту неуместна: компиляция без оптимизации, как сущность, вообще должна быть забыта. это, можно сказать, экзотический режим, нужный для поиска грубейших ошибок в программе. подчеркиваю - грубейших.

а по поводу .text, .data и т.п. секций очень рекомендую почитать документацию WinAVR - там все достаточно популярно и доходчиво объясняется, что тут к чему.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение sachok »

Мастер Ломастер Спасибо за рекомендацию. Включил оптимизацию -Os Про секции я читал до этого и тут всё ясно. Просто это моя первая попытка писать на gcc под Linux'ом до этого был CVAVR.
Я не Сашок!!!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

наткнулся на книжку C# для новичков................, в данном случае имеется обычний Си или это разновидность ???
Tell Me The Truth
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение sachok »

C# это отдельный язык программирования, построен на принципах ООП, и поддерживается платформой .NET FrameWork. Базовые операции и теория общие с всеми языками программирования. Если Вы будете знать с++ то на C# перейти не проблема. А вот в моем случае наоборот, знаю C# перехожу на с++, непривычно...
Под МК программировать не выйдет
Я не Сашок!!!
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

sachok писал(а):знаю C# перехожу на с++, непривычно...
да, знакомая история :) Знал С и шарп, приходится иногда на с++ писать на работе. Хз можете меня закидать тапками, но с++ это ужас ) си люблю, а с++ ...
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Вопросы по С/С++ (СИ)

Сообщение uldemir »

Расскажите как сделать знакогенератор. Скажем, я определяю

Код: Выделить всё

const int seg_a = 1 << 0;
const int seg_b = 1 << 1;
пока всё хорошо. Далее я хочу вычислить константу для символа "1":

Код: Выделить всё

const int let_1 = seg_b + seg_c;
На что компилятор замечает, что seg_b - это не константное выражение.
Как сделать, чтобы оно вычислялось только на этапе компиляции и не сьедало ОЗУ?

Как это принято делать?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

uldemir писал(а):Как это принято делать?

Код: Выделить всё

#define seg_a (1<<0)
#define seg_b (1<<1)

#define let_1 seg_a | seg_b
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Вопросы по С/С++ (СИ)

Сообщение uldemir »

Не получается, не выходит каменный цветок.

Код: Выделить всё

#define seg_a  (1<<0);
#define seg_b  (1<<1);
#define seg_c  (1<<2);
unsigned int charset[] = { seg_a  , (1<<2) };
Ругается на seg_a. Я так понимаю, #define это просто подстановка. строка

Код: Выделить всё

unsigned int charset[] = { (1<<0), (1<<2) };
компилируется без проблем. Где я еще не въезжаю?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Ответить

Вернуться в «Разные вопросы по МК»