if-else switch
- Войдите на сайт для отправки комментариев
Втр, 18/08/2015 - 16:32
Вопрос на грани идиотизма:
Есть 2 подпрограммы запускающиеся IF зависимо от значения переменной (до 10 и больше 10). Переменная в процессе меняется и else ее отрабатывает запуская вторую подпрограмму. В саse есть break для такого гемора, но нету "диапазона", а только четкие значения. Как это обойти не вводя новую переменную для кейса?
Чую что туплю, но не могу понять где.
return
if (menuItem < 10) {SelMSG();return;} else SelSubMSG();
Так? Не работает. Точнее работает но как-то странно.
Переменная в процессе меняется и else ее отрабатывает запуская вторую подпрограмму.
1. сработал IF по истите
2. В процессе отработки истины поменялась флаговая переменная
3. и это вызвало отработку ELSE того же IF'а?
Я правильно понял?
Еслии правильно, то так НЕ БЫВАЕТ - ищите ошибку в другом! Где-то фигурная скобка не на месте, где-то ещё что-то. Уберите всю фигню, оставьте чистый пример, печатайте отладочную информацию, - ищите. Так не бывает.
Кстати, а где кусок кода?
Ты бы хоть указал в каких строчках проблема.
И кстати, возьми за правило заключать все блоки условных операторов в фигурные строки, даже если блок состоит из одной строчки. Избавит от ошибок по невнимательности.
Трабл в лупе.
Я правильно понял?
Еслии правильно, то так НЕ БЫВАЕТ
Проверил...
И правда не бывает...
но конструкция такого типа:
if (menuItem < 10) subMenu=0; else subMenu=1;
if (subMenu == 0) SelMSG(); else SelSubMSG();
помогла... Бред...
А вообще можете обхаять данный кусок? насколько так правильно-неправильно писать.
Только то, что на глаза попало.
Строки 124-166, лучше писать if - else - if - else (впрочем здесь switch тоже подходит). Во первых - это быстрее, не будет миллиона проверок, во-вторых, порядок проверки условий более понятный, тем более у Вас меняется значение переменной и можно влететь в ситуацию, где сработают два ифа, а потом удивляться.
Если использовать switch, то можно съэкономить и код, если он повторяется, типа так:
Можно еще съэкономить на ветках 22, 41-44, если сделать menuItem++;
Однако нужно помнить, что такой подход требует бОльшего внимания, иначе будете разгребать глюки.
На первых порах я бы предложил воспользоваться конструкцией if - else - if - else.
еще 1 затуп:
при inputString= "19" или "23"
byte value=inputString[0]*10+inputString[1]-16;
value==19 или 23...
Почему -16 ?
Только то, что на глаза попало.
Большое спасибо, кейсы там и были, но в поиске глюков перепилил почем зря, не поняв сути брейка :)
++ и правда там логичнее и нагляднее, т.к. переводит к следующему полю ввода из той же менюшки. Опять же спасибо.
А чего тут хаять? Если Вам кажется, что в строках 11 и 12 вызываются ОБЕ функции, значит они вызываются при разных вызовах loop(). В одном и том же проходе они обе вызываться не могут.
А чего тут хаять? Если Вам кажется, что в строках 11 и 12 вызываются ОБЕ функции, значит они вызываются при разных вызовах loop(). В одном и том же проходе они обе вызываться не могут.
Не могут, уже согласен, проверил сам на простеньком примерчике... Но выше уровнем условие прихода "/n" с сериала. Его "не заметить" невозможно, строку не правлю нигде, чистится на каждом проходе безо всяких условий. Возможно коряво прыгаю по ф-ям, но тогда бы не помогла затычка что выше... Короче я забил. Так работает... Сейчас больше напрягает:\
byte value=inputString[0]*10+inputString[1]-16;
Сейчас больше напрягает:\
byte value=inputString[0]*10+inputString[1]-16;
byte value=inputString[0]*10+inputString[1]-16;
А чего не inputString.toInt()? Или как то так, не пользуюсь этим классом.
Вообще может быть алгоритм и корректный (никогда такого изврата не видел). Но нужно, чтобы число состояло точно из двух цифр. Чтобы перевести символ '1' в число 1 нужно вычесть 0x30 или обрезать 4 старших бита, или вычесть 48, или вычесть '0'.
Т.е. тупо, без оптимизации (говнокодом):
byte value=(inputString[0] - '0')*10+(inputString[1] - '0');
или так:
byte value=(inputString[0] & 0xF)*10+(inputString[1] & 0xF);
Я понимаю что так не бывает, но оно работает!
А не... догнал проикол... например 00:
(48)*10+48=528, младший байт = 16, тоесть отняв от него 16 поимеем 0 :)
дальше - старший разряд + 10, младший +1, тоесть все чин чином. Но только в пределах двузначных чисел...
А чего не inputString.toInt()? Или как то так, не пользуюсь этим классом.
Я им тоже не умею пользоваться. Кроме того строка значительно длиннее, и вырезать из нее нужные куски долго и муторно. Формируется она автоматом и при ошибке срс передается по новой, то-есть особой инвариантности там не предусмотрено. Все значения двузначны.
Но думаю что попробую все ж упростить. :)
Ну и, если не сложно. Как это оптимизировать?
Если такой алгоритм работает, то зачем парить мозг, пусть так и продолжает работать.
Опять грабли...
Есть мега2560 уходящая в бутлуп от собаки. Обидно.
Перенес все на очень китайскую дуню RTC отказался работать. Полез щупать пины рс4, рс5 на камень: звонятся... Нашел там нереференсные ноги CSL/SDA, подцепился к ним. Ничего. Пошел читать как поменять бутлодер на меге...
Утром вспомнил что именно эти часы точно на такой же работали... Выколупал из пакетика новую. Включил, залил... Скотина, работает... Перекинул на первую. Нихрена. Подергал пинами, дергаются. А часы нет... Чо за нахрен?
И, если не сложно, кто подскажет ссылку как прошить бут меги без програматора, через уну и где взять корректный?