void main(void){ // тут добавить настройки таймера и портов while(1){ if(!alarm_butt) state = STATE_ALARM; else if(!left_butt) state = STATE_LEFT; else if(!right_butt) state = STATE_RIGHT; else state = STATE_OFF;
if(counter & 1) switch(state){ case STATE_LEFT: left_on; break; case STATE_RIGHT: right_on; break; case STATE_ALARM: right_on; left_on; break; } else { left_off; right_off; } } }
я в прошлый раз главный цикл пропустил не могу код писать без нормального редактора...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Всем привет, может кто помочь дописать код в этом проекте? http://arduino-diy.com/arduino-svetodiodnyy-kub-4x4x4 затея такая к имеющемуся коду добавить ручное управление через терминал, смысл такой подрубаю терминал отправляю команду 1 куб переходит в ручное управление, все светодиоды гаснут (0 возвращает в мануал в котором гоняеет эффекты) в ручном управлении я посылаю команды формата (x1 y1 z1 q1) где загорается 1 светодиод по координатам x1y1z1, q1 это включение светодиода q0 выключение, ну как то так, все переменные примерно условно, вроде бы максимально просто, файл с кодом прилагаю(в статье тоже самое в скетче)за помощь накину сотни три рублей на вискас
Сегодня залез в один проект микрочиповский - решил прилизать и несколько шероховатостей сгладить... ПОка колупался, смотрю, предлагает поставить более свежие версии. Ну я и поставил. В результате, почему-то компилятор стал придираться сильнее чем раньше. Т.е. выдаёт целую толпу предупреждений. И все одного типа: main.c:767: warning: (373) implicit signed to unsigned conversion Целую толпу заборол понаставив буковок "u" у числовых констант. Но вот одну не могу забороть. Самое обидное, связано с тем, что я на предыдущей странице описывал, как попытался заменить дефайны на энумы. Вобчем код:
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Компилятор любит все приводить к int, например, это
Код:
(PORTC ^ KEYMASK) & KEYMASK
Вообще, странно. На каком бы вдруг основании, компилятору приводить это выражение к int. При том, что все части выражения - unsigned char. Мало того, в левой части присваивания, тоже unsigned char.
погуглил... понял, что в данном случае применять enum, действительно плохая идея:
Цитата:
1. Избегайте логических операций с константами enum, иначе могут появляться предупреждения несоответствия типа Warning[Pe188]. Причина в том, что операторы логики дают в результате своей работы целый тип, а не тот тип, который определен в typedef enum. Задавать битовый маски константами enum тоже плохая идея.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Оба работают одинаково Где (в какой литературе) можно почитать, когда какие типы циклов использовать предпочтительнее ? И вообще про хорошие манеры кода на Си. Просто нашел еще, что можно вообще написать конструкцию типа if (!(led <<= 1)) led=0b00000001; и оно блин работает... Только вот понять такую конструкцию, мой неокрепший мозг пока еще не готов. И поэтому собственно интересует, надо ли к таким конструкциям привыкать (тренировать мозги), или надо наоборот, раскидывать операторы построчно ?
Если вам это понятно и вы не пишете руководство для новичков, то вполне нормально. Я и сам вечно начинающий в Си (и не только), но обычно объединяю подобные выражения (что-то вроде if (!(--cnt)) cnt = N).
В раскрытом виде я записываю такое только при пошаговой отладке в случае каких-то проблем, чтобы убедиться в том, что все работает правильно.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Я хочу знать, "правильно" ли так писать, или надо (желательно, принято и т.п) расписывать в 2 строки
Моё мнение - чем проще, тем лучше. иногда принцип чуть меняется: чем ближе к сути происходящего, тем лучше. но если хорошо подумать, оба варианта есть одно и то же.
бритва Оккама не подводит
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Наверное люди делятся на две категории: одни понимают указатели, другие нет
Не так давно я об этом уже спрашивал, потом забросил, т.к. не до того было, сейчас перечитал, потом на других ресурсах почитал... Да, я все-таки из второй категории.
Имеется функция вывода текста на графический дисплей, к которому прилагается двухмерный массив констант размерностью 159*5 байт, содержащий символы:
lcd_setxy(row,col*6); ptr = lcd_font; // a value of type "const unsigned char (*)[5]" cannot be assigned to an entity of type "unsigned char *" while (*text != "\0") // operand types are incompatible ("unsigned char" and "char *") { ch = *text; if ((ch >= 32) && (ch <= '~')) ch -= 32; else ch = 255; for (i = 0; i < 5 ; i++) { lcd_send(*(ptr+ch * 5 + i),DTA); } lcd_send(0,DTA); // Additional space text++; } }
Вызываю функцию так:
Код:
lcd_out(1,3,"test\0");
Что я делаю неправильно? Ошибки указаны выше, плюс есть еще предупреждение, касающееся вызова функции. Его я скопировать не могу, оно в виде подсказки вылезает, но говорится там о конвертации между указателем и целым с изменением знака
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У вас ошибка не связана с указателем. Вы почему-то забыли, что символ пишется в одиночных кавычках, а в двойных - это уже строка, т.е. массив. Что касается конвертации, то скорее всего дело в том, что char по умолчанию может быть как со знаком, так и без оного, и указатель на знаковый char и беззнаковый - разные типы указателей.
Кстати, "test\0" - ноль в конце лишний, текст в двойных кавычках всегда автоматически дополняется нулем.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:2 Медали: 1
Первая ошибка связана с тем, что вы пытаетесь присвоить неконстантному указателю значение константного. Это "по закону" запрещено, ибо таким образом появляется "дырка", позволяющая изменить константные данные. А зачем Вам вообще нужен указатель ptr ? Про вторую ошибку уже сказали - виноваты двойные кавычки. Символ обрамляется в одинарные. Ну а проще написать так :
Спасибо за подсказки. Сделал так (точнее вернул на место)
Код:
lcd_send(lcd_font[ch][i],DTA);
, но все-таки хотелось бы понять почему нельзя через указатель сделать то же самое. Вычитал тут, правда по плюсам, что может быть const int *ptr и int *const ptr. Оба определения у меня проходят, но ptr = lcd_font все равно вызывает ошибку. Да и ворнинг на вызове функции остался:
Цитата:
passing 'char [5]' to parameter of type 'unsigned char *' converts between pointers to integer types with different sign
, хотя все скомпилировалось.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:2 Медали: 1
Zhuk72 писал(а):
Вычитал тут, правда по плюсам, что может быть const int *ptr и int *const ptr.
Один - указатель на константу int, другой - указатель-константа на int. Т.е. , в одном случае нельзя менять данные по указателю, в другом - нельзя менять сам указатель, но данные по нему можно. Если будет const int* const ptr, то это будет указатель-константа на константные данные. Т.б. нельзя будет изменять ни указатель, ни данные по нему. Всё, что находится до символа "*", относится к данным, на которые указывает указатель. Всё, что после символа - к самому указателю.
Zhuk72 писал(а):
но ptr = lcd_font все равно вызывает ошибку.
ptr должен быть указателем на такой же тип, с такими же квалификаторами, как и lcd_font.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения