Объявление константы через выражение

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Добрый день.

Не нашёл ответа в "Учебниках" и обращаюсь к знатокам....

В самом начале скетча объявляю нужную мне константу, например так

1const unsigned long time_sensor_query = 30 * 1000;

И никаких проблем нет, получаю значение 30000. Но если далаю так

1const unsigned long time_sensor_query = 33 * 1000;

то получаю это: 4294934760

В чём проблема? Все работает до 32-х

sadman41
Offline
Зарегистрирован: 19.10.2016

См. приведение типов и делай раз:

1const unsigned long time_sensor_query = 33 * 1000UL;

или два:

1const unsigned long time_sensor_query = (unsigned long) 33 * 1000

Недавний случай: http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/neponyatnoe-povedenie-peremennoi-long

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Спасибо большое! Всё заработало. Тема закрыта!

Получается что я объявляю и тип переменной и тип присваемого выражения.. Немного странная (непривычная)  логика...

 

sadman41
Offline
Зарегистрирован: 19.10.2016

По ссылке прочитаете сообщение от DetSemen - в нём объясняется, почему так.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

по стандарту языка ЛЮБАЯ константа, справа от "=", считается "int", если не указано другое.

Если ты вообще планируешь в жизни заниматься программированием на разных языках - возьми за правило указывать явно типы констнант.

Для С это вот так: (Первую же ссылку из Яндекса сюда выкладываю ;)) )

Цитата:

Числовые константы могут быть целыми и вещественными. Целые, в свою очередь, могут иметь десятичное (типа int), восьмеричное или шестнадцатеричное представление:

  • десятичные: -18, 0, 12, 345, …;
  • восьмеричные (начинаются с нуля): 00, 014, 045, 0777…;
  • шестнадцатеричные (начинаются с ): 0х0000, 0х1A27, 0х5FFF, FFF,…

По умолчанию целые десятичные константы имеют тип 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.

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

// offtop

Спасибо за ответы.. Действительно, с Си только знакомлюсь (и то потому что увлёкся микроконтроллерами). Начинал на Делфи, там тоже строгое объявление переменных. Но последние лет 20 профессионально "сизу" на PHP. А там и вольностей побольше да и логика чуть иная )))

Кстати, sadman41, мне привычнее второе объявление типов. Думаю при компиляции это одно и тоже, а читаемость понятнее ))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

GoDr пишет:

то получаю это: 4294934760

А чё, красивое число. 

Первый закон Скотта знаете?

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

ЕвгенийП пишет:
Первый закон Скотта знаете?

+!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

GoDr пишет:

Но последние лет 20 профессионально "сизу" на PHP.

"Никак не можно!" pHp 4, с которого можно начинать историю массового использования - вышел в 2000, то есть 19 лет назад ;)))). А реально pHp стал основой 90% сайтов в мире, начиная все-таки с pHp 5, а это уже 2004.

sadman41
Offline
Зарегистрирован: 19.10.2016

У пхпшников год за три идёт.

А у перловщиков даже носа не видно.

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

wdrakula пишет:
"Никак не можно!"
к сожалению или к счастью я с тройки с ним знаком ))))) Да что там с "тройки", я Delphi 2.0 помню... ))))) да что там Делфи.. я ещё помня как ZX-spectrum взламывал у которого программы на ауодикассеты записывались ))))))))))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

GoDr пишет:

wdrakula пишет:
"Никак не можно!"
к сожалению или к счастью я с тройки с ним знаком ))))) Да что там с "тройки", я Delphi 2.0 помню... ))))) да что там Делфи.. я ещё помня как ZX-spectrum взламывал у которого программы на ауодикассеты записывались ))))))))))

Родное сердце, тут почти всем под 50 или за 50! ;))) Мне вот 49. Молодежь сегодня не сильно интересуется самоделками и контроллерами.

Но возраст не извиняет пробелы в основах. Учись -- это всегда полезно и приятно! ;))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

sadman41 пишет:

У пхпшников год за три идёт.

А у перловщиков даже носа не видно.

!!!ОФФТОП!!!!

Ой! Как ты прав!!! Особенно радуют переводы сайта в 20-30-40 тысяч строк, на pHp 7!!!!!!!!!!! ereg в preg, мать ЕГО!!!! Какого чорта? Вот кто-то знает, зачем? Ну ладно - для совместимости с новыми идеями, а поддержку старого ereg нужно было обязательно убирать?

Я уже думал скрипт писать, который эти ё..аные два слеша добавляет. Н

Отсутствие глобалов по умолчанию, из-за чего вся работа с SQL летит в ...! И это не козни массонов и коммунистов! Это свои же - друзья программисты, из группы разработчиков, решают, что так будет всем праздник!

Конечно праздник - сколько заказов можно собрать на перевод сайта под 7ой пых!

sadman41
Offline
Зарегистрирован: 19.10.2016

Особенно меня радуют извращения типа TWIG - шаблонизатор, погоняющий бывшим шаблонизатором. 

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

// offtop

Я уже года три вообще не поддерживаю всё что меньше PHP7. Как говориться, кто хочет сине-белый сайт с красными буквами и адаптированный по Осла - идите к ... ослу )))))

А микроконтроллерами занялся, так просто сын повзрослел и захотел прикольные игрушки ))) Соберёшь ему пару светофоров и шлагбаумов на макетке и неделю квартира превращается в автогород. Да и на даче обленился.. хочется больше лени и комфорта ))))

 

KindMan
Offline
Зарегистрирован: 19.12.2018

Вообще конечно не понятно, почему они не сделали после const приведение типов. Это же не define, где я сам должен об этом позаботится. Сначала говорят, в плюсах используйте const у них есть тип, это readonly переменная, компилятору проще, а потом, если вдруг выражение, все типы сами опишите.

sadman41
Offline
Зарегистрирован: 19.10.2016

Наверное эти мерзавцы себе представить не могли, что будут системы 32-х и 64-х разрядные. Поэтому прописали в стандарте автоприведение к наибольшей существовавшей разрядности. Хотя, об этом лучше ЕвгенийП расскажет - поди у них, в академиях, историю вопроса преподавали.

KindMan
Offline
Зарегистрирован: 19.12.2018

sadman41 пишет:

Поэтому прописали в стандарте


Да, вот это особенно приятно, читать эти ISO/IEC 14882:2014 на 1300 страниц. Ардуино - это просто!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

KindMan пишет:
Вообще конечно не понятно, почему они не сделали после const приведение типов.

"Есть многое на свете, друг Горацио ..."

KindMan пишет:
Сначала говорят, ..., а потом ...

Как говаривала Рая Абельская: "Вот вам любовь-морковь, не хочете - не ешьте" :)

KindMan пишет:
особенно приятно, читать эти ISO/IEC 14882:2014 на 1300 страниц.

А кто Вас заставляет читать устаревшие стандарты? Читайте ISO-IEC 14882 - 2017, в нём 1618 страниц - всё намного подробнее и понятнее.

KindMan
Offline
Зарегистрирован: 19.12.2018

ЕвгенийП пишет:

Читайте ISO-IEC 14882 - 2017, в нём 1618 страниц - всё намного подробнее и понятнее.


Не, это как, сиквел читать, а оригинал нет? Сюжет потеряю

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Может я дилетант, но хоть убей, не понимаю смысл вообще const! Если ради того чтобы защитить переменную от записи - бред тогда.. и так её не переписать если не в коде нет ничего. Я может с логики PHPшника мыслю конечно, там понятное дело, защита нужна, можно что угодно подключить и переписать..

"Компилятору легче" - в чём? ))))) на пару микросекунд дольше компилить будет? ))))))

PS

кстати, передумал константы использовать.. решил оставить переменные... Вдруг на будущее понадобится настройки онлайн менять...

sadman41
Offline
Зарегистрирован: 19.10.2016

Компилить дольше не будет, но от факапа защитит, когда накативший погроммист в забытьи константную переменную заинкрементирует, а потом будет трусы выкидывать после того, как его газовый котёл на Марс стартанёт.

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

sadman41, я тоже на унтигурском языке умею разговаривать ))))) 

PS

Кстати, завтра постараюсь выложить свой проект со всеми подробностями, в том числе  скетч и схемы. Очень буду ждать критики, а больше, подсказок и оптимизации. Осталось чуть допилить и оптимизировать функционал. 

PSS

всё время забываю что это микроконтроллер.. Постоянно хочется перейти на ООП, мультиязычность и подгрузку библиотек и классов )))) Ненавижу прямолинейно код писать... Как вспомню GOTO в бейсике )))))

sadman41
Offline
Зарегистрирован: 19.10.2016

Откройте для себя прерывания... сразу маму вспомните и всех родственников до седьмого колена, настолько всё станет непрямолинейно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

GoDr пишет:

Может я дилетант

Почему "может"?

GoDr пишет:

 не понимаю смысл вообще const!

Сегодня я уж имел честь Вам цитировать "Вильяма нашего ...": "Есть многое на свете, друг Горацио ..."

GoDr пишет:

и так её не переписать если не в коде нет ничего. 

Ну, во-первых, переписать её, при желании, - как два пальца. А во-вторых, что значит "в коде нет ничего". Кто это проверял? Вот если поставите const. то компилятор и проверит есть в коде чего или нет.

sadman41
Offline
Зарегистрирован: 19.10.2016

Евгений Петрович, не соблаговолите ли в теме про шаблоны намекнуть про то, куда смотреть для того, чтобы "сделать красвио и по эфективности не хуже"?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sadman41 пишет:

Наверное эти мерзавцы себе представить не могли, что будут системы 32-х и 64-х разрядные. Поэтому прописали в стандарте автоприведение к наибольшей существовавшей разрядности. Хотя, об этом лучше ЕвгенийП расскажет - поди у них, в академиях, историю вопроса преподавали.

Влад же написал в сообщении №4, что вычисления по умолчанию производятся в int. А int на 32-разрядных системах 32-разрядный. Откуда следует, что некоторые константы при отсутствии явного указания типа входящих в них элементов при одинаковом описании могут принимать различные значения. Откомпилируйте приведенный в теме фрагмент на Arduino Due и почувствуйте разницу.

И, кстати, 32-разрядные системы появились задолго до появления не только микроконтроллеров, но и ПК.

sadman41
Offline
Зарегистрирован: 19.10.2016

Adriano, не буду для данного эксперимента покупать Due, но с удовольствием почитаю про логику приведения переменных к int16_t. Слышал байку про то, как сетевой комитет спорил о размерности Ethernet Hardware Address (MAC): половина проголосовала за 32bit, половина за 64bit. Сошлись на середине - 48bit.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sadman41 пишет:

Слышал байку про то, как сетевой комитет спорил о размерности Ethernet Hardware Address (MAC): половина проголосовала за 32bit, половина за 64bit. Сошлись на середине - 48bit.

Выскажу альтернативную гипотезу: во всем виноваты русские с ихней БЭСМ-6.