Ругается не на цикл, а за выход за рамки ?
Давай вот без этих глупостей? Нет никакого “компилятора Ардуины”. Посмотри на то, чем ты пользуешься! Это самый стандартный GCC, который фактически основной компилятор на планете Земля и не только языка Си.
И да, “ракеты в космос” запускаются почти наверняка с использованием того же самого GCC. Это успокаивает тебя? Надеюсь!
Я не знаю архитектуру микроконтроллера Ардуино, но улавливаю, что получается неявное и никем не контролируемое изменение типа данных, которое приводит к таким чудесам. Не говорите пожалуйста что “это не ошибка, так и задумано”. Если все значения по факту хранятся в какой-то там четырехрегистровой среде, так зачем этот цирк с эмуляцией двухбайтовых типов данных?! Скажите “у нас по умолчанию все данные занимают четыре байта, поэтому не парьтесь и всегда используйте четыре байта под хранение данных”. Но только правда при этом неважно сколько байт отводится под хранение данных - важно правильно обрабатывать их во всём диапазоне значений.
Говорят же вам пишите условие правильно - 0…32767 = все положительные и 0 … >=0
Ваша упертость - очень похожа на глупость !
Мне кажется вы выборочно как-то читаете мой текст. Не люблю так, но вынужден ответить вопросом на вопрос - неравенства “i < 32768” и “i <= 32767” математически идентичны?
нет такого числа для двухбайтового INT и компилятор вам об этом сообщил !
Нет никакой “архитектуры Ардуино”! Ардуино - это концепция общей библиотеки Wiring, для программирования многих РАЗНЫХ контроллеров на языке С++.
На вскидку используются архитектуры:
- AVR - всякие Уно/Нано и пр… 8 разряная
- ARM - Дуе, Распберри Пико, СТМ… 32 разрядная
- Xtensa - ЕСП8266, ЕСП32… 32 разрядная
коллеги добавят
Ага… Значит вот тут он проконтролировал соблюдение границ типов данных? Почему тогда у меня получилось в переменной получить значение 1,5 млн?
У него хватает мозгов увидеть, что число в условии превышает размерность int, т.е. тут автор однозначно допустил ошибку
А вот неопределенности компилятор рассматривает под углом “автору виднее, что ему надо”. До вас не доходит, что это условие ВСЕГДА будет истинным? Следите за пальцами
32767 + 1 == - 32768;
-32768 <= 32767;
Логично? Еще как. Ну и в каком случае ваш цикл сможет завершиться?
Компилятор вам почти по человечески сказал, что int i = 32768 - это из области фантастики
Вот вынужден согласиться
ну вы же попросили у компилятора СТРАННОЕ - вот он вам и выдал СТРАННОЕ !
Я отучился в МГУ им Ломоносова, на МехМате, отделение мат. логики в 86-91 годах. Тебя мой ответ устроит? Диплом - не “красный” уж прости!
НЕТ. Это разные утверждения в кольце вычетов по 2 в 15 степени. В этом кольце число 32768 не существует.
Я, к сожалению, закончил только восемь классов ещё советской школы (когда было 8 и 10). Меня в школе научили, что это равнозначные неравенства. Поэтому сейчас я ловлю клина от мысли о том, что должен трактовать это как два неравнозначных неравенства.
Ладно, не будем спорить… В конце концов, в чужой монастырь со своим уставом не ходят. Наверное, тут другой мир с другой атмосферой. Особенности работы с флагом переполнения я понял, особенностей как двухбайтовая переменная вдруг смогла хранить значение не в 64, а в 1,5 млн - не понял. Уж простите. Дело то ведь не во мне… Когда на грабли наступает 1 человек - это его проблема. Когда толпа - встаёт вопрос “а какой м…ак сюда эти грабли положил?”. Если я единичный случай, так и бог с ним. Если каждый новичок в Ардуино приходящий, будет на них наступать, это будет уже другой вопрос.
Старший бит - это бит ЗНАКА, а не бит ПЕРЕПОЛНЕНИЯ !
Должен знать язык на котором программируете. Вы его не знаете, в этом Ваша проблема. Именно Ваша, а не языка и не компилятора.
Именно в Вас!
где вы толпу увидели? оглянитесь, вы тут такой один.
Я больше всех раскопал о вашем, так называемом, баге.
Но внимательнее прочитайте мой вывод - если вы изначально пишете неверный код, то нечего на компилятор кивать, когда он выполняет его не так, как вы ожидали.
Нет смысла задумыватся, почему “неопределенное поведение” пошло по тому пути, а не иначе. Оно потому и “неопределенное”, что зависит от всего - от версии компилятора, от модели процессора, от погоды на Ямале, в конце концов.
Не надо задаваться ИДИОТСКИМ вопросом, почему компилятор сработал так. Важнее разобраться в другом - как писать. чтобы этого не было.
Изучайте С++, чтобы не попадать в такие ловушки.
Я знаю. Но для типа int, у которого старший бит является ЗНАКОВЫМ, для хранения ЧИСЛА остается только 7 бит. И в этом случае когда я выполняю действие:
1111111+
0000001=
0000000
возникающая при переполнении 1 переносится не в 8-й бит, хранящий ЗНАК, а во флаг переполнения CF. И уже взведенный флаг CF кричит о том, что произошел выход за границы допустимых значений типа данных. Именно так и должны контролироваться, по моим представлениям, границы диапазона ABS(0…127).
Я уже понял, что в Ардуино это не так…
Ардуино не пишет своих компиляторов. В Ардуино Нано используется gcc(если вам это о чем-то говорит).
Если нет - я поясню, gcc это самый распространенный компилятор С++ на планете на данный момент. Он используется миллионами программистов в миллионах устройств, не только в ардуино.
Ардуино и компилятор в вашей проблеме не виноваты. Просто каждый инструмент надо использовать по назначению. Если вы отрубите топором голову соседу - судить будут не топор.
ну будьте вы поумнее, остановитесь.
или он так и будет отвечать на каждое ваше сообщение.
Озвучьте конкретную платформу - проверим что там и как со старшим битом …
Да ладно, действительно пора заканчивать. Решим, что виновата моя голова.