«Кстати, о птичках»™ Раз уж зашёл разговор о редко используемых и малоизвестных возможностях. И С, и С++ позволяют символьные литералы из нескольких символов. Одно требование — должно влазить в int. Т.е. на платформе с 16-битным int позволяется запись 'AB', с 32-битным — 'ABCD'. Размещение в памяти зависит от порядка следования байтов на заданной платформе. Самый правый символ сидит в младшем байте числа, а не по младшему байту памяти, например,
Код:
'AB' == ('A' << CHAR_BIT) | 'B';
На IBM PC программа
Код:
#include <stdio.h> int a = 'ABCD'; int main() { printf( "%4.4s\n", (char *)&a ); return 0; }
печатает
Код:
DCBA
Кстати, пример показывает, как правильно печатать строки известного размера без концевого 0 «точность» в спецификаторе формата вывода строки выполняет ту же роль, что и длина в strncpy()
Тут тоже есть тонкое различие между C и C++. С: тип литералов 'A' и 'AB' — int С++: тип литерала 'AB' — int, а вот 'A' - char. Т.е. односимвольные литералы в C++ сменили тип с int на char, это сделано для возможности их ввода/вывода операторами >> и <<
Если бы для 1-символьного сохранился тип int, нельзя было бы напрямую напечатать литерал.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Всем МЯУ ! хлопцы (может и девушки тоже) помогите разобраться. пишу меню с помощью структур. кот простой. откомпилился в CVAVR без проблем. все вроде хорошо. а на деле не работает... обидно... может поможете? код прикрепляю. но часть приведу:
struct menu { char Pos1[]; char Pos2[]; }; struct menu MENU_1= {"LED1", "LED2"};
struct menu *ptr=&MENU_1;
потом нада вывести на дисплей -
put_string(10,50, (*ptr).Pos1, red); но ничего не выводится...
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
вообще-то так строки в структуру помещать некорректно... Pos1 и Pos2 у вас получаются массивами неопределенной длины, на сколько я в курсе, такие массивы могут помещаться в структуры только единственный раз - в самом конце, т.е. "открытый" массив должен быть последним. вам надо объявить ваши поля простыми указателями char* и работать с ними соответственно
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
а можно подробней. при объявлении полей как указатели char* CVAVR матюкается. наверно я чт то не так понял. и если я задам размер полей char от этого ничего вроде не изменится.... вроде
Суть в том, что функция отправляет данные в дисплей send(данные, 0-комманда или 1-данные) В конце её выполнения контроллер уходит в астрал!!! - не возвращается из функции и улетает за пределы кода(как-будто нет инициализации стека) И ещё проблема при инициализации SPI, устанавливаю флаг MSTR, но мотом он сбивается - становится равным 0
Последний раз редактировалось romazan Вт дек 07, 2010 20:29:22, всего редактировалось 3 раз(а).
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19651 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
А вы сами-то свой код понимаете?
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Зарегистрирован: Чт май 21, 2009 13:54:07 Сообщений: 335 Откуда: Москва
Рейтинг сообщения:0
короче разобрался что было с вылетом из функции, решилось переустановкой AvrStudio, но вот с SPI проблема, как только происходит установка бита, в следующий же цикл он вылетает. Попробовал в настройках симулятора поставить вместо 64 меги - 8, и проблема ушла
Подскажите, отчего могут "портится" массивы. периодически меняется значение некоторых ячеек. Если объявить массив константой, то проблема уходит, и массивы не портятся. я бы так и оставил, но один элемент этого массива должен изменятся в процессе работы. Да и понять охота, почему. Тем более и другие массивы сбивались, но их значение менять не нужно, и я их просто объявил как константы.
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19651 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Если меняться должен только один элемент, м.б. не делать его частью массива?
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19651 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Вы же код не привели... М.б. у вас какая-нить локальная переменная, не объявленная как static
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Господа помогите написать правильную маску Есть такое выражение
Код:
Допустим 1. 0xEE&0xEE&0x0F=0x0E устраивает
но если 2. 0xED&0xEE&0x0F=0x0C
или в общем виде B&A = С
Если c!=A то нужно чтобы результат был 0, если c=A то результат должен быть A какую следует написать маску чтобы получить требуемый результат IF или конструкцию типа a==c:c?0; не хочу использовать.
IF или конструкцию типа a==c:c?0; не хочу использовать.
В любом случае нужно проверять биты совместно, так как если даже в каком-то одном бите несовпадение, то занулить нужно все биты. Одними инверсиями и маскированиями ~ & | ^ не отделаться.
А можно поинтересоваться, почему? Конструкция с IF будет компактнее и быстрее, так в чём причина отказа?
Код:
uint8_t foo(uint8_t c, uint8_t A) { if( c != A ) c = 0; return c; }
avr-gcc -Os -S
Код:
.global foo foo: cpse r24,r22 ; никаких условных переходов, всего две команды ldi r24,lo8(0) ret
arm-kgp-eabi-gcc -mcpu=cortex-m3 -mthumb -O2 -S
Код:
foo: cmp r0, r1 ite eq moveq r0, r1 ; тоже без условнх переходов, хотя эта команда и лишняя movne r0, #0 bx lr
Даже для пентиума, у которого как бы страшны IF-ы (точнее, переходы) возможным разрушением конвейера, тут после CMP будет вкомпилрована команда CMOVNE, условного перехода не будет.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения