Объявление константы через выражение
- Войдите на сайт для отправки комментариев
Сб, 16/03/2019 - 13:05
Добрый день.
Не нашёл ответа в "Учебниках" и обращаюсь к знатокам....
В самом начале скетча объявляю нужную мне константу, например так
1 | const unsigned long time_sensor_query = 30 * 1000; |
И никаких проблем нет, получаю значение 30000. Но если далаю так
1 | const unsigned long time_sensor_query = 33 * 1000; |
то получаю это: 4294934760
В чём проблема? Все работает до 32-х
См. приведение типов и делай раз:
1
const
unsigned
long
time_sensor_query = 33 * 1000UL;
или два:
1
const
unsigned
long
time_sensor_query = (unsigned
long
) 33 * 1000
Недавний случай: http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/neponyatnoe-povedenie-peremennoi-long
Спасибо большое! Всё заработало. Тема закрыта!
Получается что я объявляю и тип переменной и тип присваемого выражения.. Немного странная (непривычная) логика...
По ссылке прочитаете сообщение от DetSemen - в нём объясняется, почему так.
по стандарту языка ЛЮБАЯ константа, справа от "=", считается "int", если не указано другое.
Если ты вообще планируешь в жизни заниматься программированием на разных языках - возьми за правило указывать явно типы констнант.
Для С это вот так: (Первую же ссылку из Яндекса сюда выкладываю ;)) )
Числовые константы могут быть целыми и вещественными. Целые, в свою очередь, могут иметь десятичное (типа int), восьмеричное или шестнадцатеричное представление:
По умолчанию целые десятичные константы имеют тип int.
Константам целого типа, используемым в программе, можно явно указать требуемый тип с помощью суффиксов L, l (long), U и u (unsigned). Например, константа 15L будет иметь тип long. Можно использовать суффиксы L и U одновременно, например, 24UL.
Константы вещественного типа имеют по умолчанию тип double. Примеры вещественных констант: -1.314, 3.98, 0.8765, … Также можно явно указать тип константы с помощью суффиксов F, f (float), L и l (long). Например, константа 1.57E+5L будет иметь тип long, а константа 3.22f — тип float.
// offtop
Спасибо за ответы.. Действительно, с Си только знакомлюсь (и то потому что увлёкся микроконтроллерами). Начинал на Делфи, там тоже строгое объявление переменных. Но последние лет 20 профессионально "сизу" на PHP. А там и вольностей побольше да и логика чуть иная )))
Кстати, sadman41, мне привычнее второе объявление типов. Думаю при компиляции это одно и тоже, а читаемость понятнее ))
то получаю это: 4294934760
А чё, красивое число.
Первый закон Скотта знаете?
+!
Но последние лет 20 профессионально "сизу" на PHP.
"Никак не можно!" pHp 4, с которого можно начинать историю массового использования - вышел в 2000, то есть 19 лет назад ;)))). А реально pHp стал основой 90% сайтов в мире, начиная все-таки с pHp 5, а это уже 2004.
У пхпшников год за три идёт.
А у перловщиков даже носа не видно.
Родное сердце, тут почти всем под 50 или за 50! ;))) Мне вот 49. Молодежь сегодня не сильно интересуется самоделками и контроллерами.
Но возраст не извиняет пробелы в основах. Учись -- это всегда полезно и приятно! ;))
У пхпшников год за три идёт.
А у перловщиков даже носа не видно.
!!!ОФФТОП!!!!
Ой! Как ты прав!!! Особенно радуют переводы сайта в 20-30-40 тысяч строк, на pHp 7!!!!!!!!!!! ereg в preg, мать ЕГО!!!! Какого чорта? Вот кто-то знает, зачем? Ну ладно - для совместимости с новыми идеями, а поддержку старого ereg нужно было обязательно убирать?
Я уже думал скрипт писать, который эти ё..аные два слеша добавляет. Н
Отсутствие глобалов по умолчанию, из-за чего вся работа с SQL летит в ...! И это не козни массонов и коммунистов! Это свои же - друзья программисты, из группы разработчиков, решают, что так будет всем праздник!
Конечно праздник - сколько заказов можно собрать на перевод сайта под 7ой пых!
Особенно меня радуют извращения типа TWIG - шаблонизатор, погоняющий бывшим шаблонизатором.
// offtop
Я уже года три вообще не поддерживаю всё что меньше PHP7. Как говориться, кто хочет сине-белый сайт с красными буквами и адаптированный по Осла - идите к ... ослу )))))
А микроконтроллерами занялся, так просто сын повзрослел и захотел прикольные игрушки ))) Соберёшь ему пару светофоров и шлагбаумов на макетке и неделю квартира превращается в автогород. Да и на даче обленился.. хочется больше лени и комфорта ))))
Вообще конечно не понятно, почему они не сделали после const приведение типов. Это же не define, где я сам должен об этом позаботится. Сначала говорят, в плюсах используйте const у них есть тип, это readonly переменная, компилятору проще, а потом, если вдруг выражение, все типы сами опишите.
Наверное эти мерзавцы себе представить не могли, что будут системы 32-х и 64-х разрядные. Поэтому прописали в стандарте автоприведение к наибольшей существовавшей разрядности. Хотя, об этом лучше ЕвгенийП расскажет - поди у них, в академиях, историю вопроса преподавали.
Поэтому прописали в стандарте
Да, вот это особенно приятно, читать эти ISO/IEC 14882:2014 на 1300 страниц. Ардуино - это просто!
"Есть многое на свете, друг Горацио ..."
Как говаривала Рая Абельская: "Вот вам любовь-морковь, не хочете - не ешьте" :)
А кто Вас заставляет читать устаревшие стандарты? Читайте ISO-IEC 14882 - 2017, в нём 1618 страниц - всё намного подробнее и понятнее.
Читайте ISO-IEC 14882 - 2017, в нём 1618 страниц - всё намного подробнее и понятнее.
Не, это как, сиквел читать, а оригинал нет? Сюжет потеряю
Может я дилетант, но хоть убей, не понимаю смысл вообще const! Если ради того чтобы защитить переменную от записи - бред тогда.. и так её не переписать если не в коде нет ничего. Я может с логики PHPшника мыслю конечно, там понятное дело, защита нужна, можно что угодно подключить и переписать..
"Компилятору легче" - в чём? ))))) на пару микросекунд дольше компилить будет? ))))))
PS
кстати, передумал константы использовать.. решил оставить переменные... Вдруг на будущее понадобится настройки онлайн менять...
Компилить дольше не будет, но от факапа защитит, когда накативший погроммист в забытьи константную переменную заинкрементирует, а потом будет трусы выкидывать после того, как его газовый котёл на Марс стартанёт.
sadman41, я тоже на унтигурском языке умею разговаривать )))))
PS
Кстати, завтра постараюсь выложить свой проект со всеми подробностями, в том числе скетч и схемы. Очень буду ждать критики, а больше, подсказок и оптимизации. Осталось чуть допилить и оптимизировать функционал.
PSS
всё время забываю что это микроконтроллер.. Постоянно хочется перейти на ООП, мультиязычность и подгрузку библиотек и классов )))) Ненавижу прямолинейно код писать... Как вспомню GOTO в бейсике )))))
Откройте для себя прерывания... сразу маму вспомните и всех родственников до седьмого колена, настолько всё станет непрямолинейно.
Может я дилетант
Почему "может"?
не понимаю смысл вообще const!
Сегодня я уж имел честь Вам цитировать "Вильяма нашего ...": "Есть многое на свете, друг Горацио ..."
и так её не переписать если не в коде нет ничего.
Ну, во-первых, переписать её, при желании, - как два пальца. А во-вторых, что значит "в коде нет ничего". Кто это проверял? Вот если поставите const. то компилятор и проверит есть в коде чего или нет.
Евгений Петрович, не соблаговолите ли в теме про шаблоны намекнуть про то, куда смотреть для того, чтобы "сделать красвио и по эфективности не хуже"?
Наверное эти мерзавцы себе представить не могли, что будут системы 32-х и 64-х разрядные. Поэтому прописали в стандарте автоприведение к наибольшей существовавшей разрядности. Хотя, об этом лучше ЕвгенийП расскажет - поди у них, в академиях, историю вопроса преподавали.
И, кстати, 32-разрядные системы появились задолго до появления не только микроконтроллеров, но и ПК.
Adriano, не буду для данного эксперимента покупать Due, но с удовольствием почитаю про логику приведения переменных к int16_t. Слышал байку про то, как сетевой комитет спорил о размерности Ethernet Hardware Address (MAC): половина проголосовала за 32bit, половина за 64bit. Сошлись на середине - 48bit.
Слышал байку про то, как сетевой комитет спорил о размерности Ethernet Hardware Address (MAC): половина проголосовала за 32bit, половина за 64bit. Сошлись на середине - 48bit.