Вопросы по С/С++ (СИ)
[uquote="jcxz",url="/forum/viewtopic.php?p=3669729#p3669729"]Поэтому определил свой набор[/uquote]я так и предположил 
- Реклама
это может и не проще, но правильнее по логике. а для float ваш алгоритм тоже подойдет? мой - да. заодно мой алгоритм подойдет и для ввода дней недели в символьном виде, и для месяца и для чего угодно - преобразуем из машинно-удобного вида в человеко-удобный, правим ПОСИМВОЛЬНО, затем обратно в машинно-удобный вид. первый и последний этап делается стандартными библиотечными функциями типа atoi-itoa, весь труд в написании посимвольного редактора строки для ограниченного набора символов. собственно, в самом простом случае это сводится к двум операторам ifjcxz писал(а):И это - проще???
Код: Выделить всё
if(str[cur_pos] > MAX_SYMBOL) str[cur_pos] = MIN_SYMBOL;
if(str[cur_pos] < MIN_SYMBOL) str[cur_pos] = MAX_SYMBOL;разумеется, для более сложных задач типа редактирования float надо корректно отслеживать изменения cur_pos, чтобы не начать править "точку" или "Е" - но это нюансы...
что касается простоты, то задаю провокационный вопрос: а зачем тогда мощность МК, если надо делать "как проще", а не как удобнее или красивее? боитесь, что МК перегреется?
Добавлено after 4 minutes 10 seconds:
P.S. самое интересное, что обработку нажатий кнопки, отслеживание (и показ) положения "курсора" и т.п. - все и так необходимо делать. Причем переводить число в символьный вид тоже, ведь человеку надо видеть, что он ввёл
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Тут вопрос только в том, что у вас в дефиците - RAM, FLASH или вычислительная мощность. Если всего в достатке, то пофиг как делать, лишь бы правильно. Я бы редактировал и параллельно отображал строку, а в реальное значение пересчитывал только когда надо это значение применить или проверить на диапазон.
даже у крошки attiny13 достаточно ресурсов любого типа для обоих подходов, так что дело не в дефиците ресурсов, а в дефиците логики.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Где одну то ? Ему нужно изменить число, состоящее из нескольких цифр !jcxz писал(а):Ну да - автору нужно изменить всего одну цифру, .... бла-бла-бла ...
Делать itoa (или ему подобное) для вывода на дисплей, а потом по индексу вычислять разряд, изменяя число на 1/10/100/1000/... - это проще ? Шутишь ?
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3669725#p3669725"]С символами я бы запутался думаю.[/uquote] Как можно с ними запутаться, если Вы уже делаете преобразование числа в строку ? А это уже полдела сделано.
Осталось только каждую "циферку" отредактировать по индексу и перевести обратно в число. Всё ! Логично, понятно и правильно !
Добавлено after 12 minutes 3 seconds:
Пример "в лоб", для простоты :
Код: Выделить всё
................
................
char ch_val[16]; // 16 - от балды
int idx=0;
................
................
if(btnUp){
ch_val[idx]++;
if(ch_val[idx] > '9') ch_val[idx] = '0';
}
if(btnDown){
ch_val[idx]--;
if(ch_val[idx] < '0') ch_val[idx] = '9';
}
if(btnOk){
idx++;
// Тут проверка на перепонение индекса и выход из редактирования
}
................
................
- Реклама
[uquote="Аlex",url="/forum/viewtopic.php?p=3670077#p3670077"][
Ну и что тут сложного и запутанного ?[/uquote]я понял Вашу мысль, запутался бы наверное я в своей писание, поскольку там много всего всякого нагородил. и не совсем было понятно как реализовать все эти преобразования, без последствий всего кода
Добавлено after 8 minutes 1 second:
пример кода преобразования числа long в строку можно в лоб, да так, чтобы в элементы массива поместить каждую цифру числа поотдельности
Ну и что тут сложного и запутанного ?[/uquote]я понял Вашу мысль, запутался бы наверное я в своей писание, поскольку там много всего всякого нагородил. и не совсем было понятно как реализовать все эти преобразования, без последствий всего кода
Добавлено after 8 minutes 1 second:
пример кода преобразования числа long в строку можно в лоб, да так, чтобы в элементы массива поместить каждую цифру числа поотдельности
Эм... А как Вы выводите своё число на дисплей (ну или на чём Вы там редактируете) ?ROMan2947 писал(а):пример кода преобразования числа long в строку можно в лоб
Без преобразования его в строку, это сделать невозможно. По крайней мере, я не знаю как это можно сделать по-другому
[uquote="Аlex",url="/forum/viewtopic.php?p=3670097#p3670097"]А как Вы выводите своё число на дисплей[/uquote] разбивают на отдельные цифры их в массив, после sprintf и на вывод
Тогда я Вас не понял. Вот это : [uquote="ROMan2947",url="/forum/viewtopic.php?p=3670091#p3670091"]пример кода преобразования числа long в строку можно в лоб, да так, чтобы в элементы массива поместить каждую цифру числа поотдельности[/uquote] что было ? Просьба показать код ?
[uquote="Аlex",url="/forum/viewtopic.php?p=3670103#p3670103"]Просьба показать код ?[/uquote]да, любопытно посмотреть
Дак Вы же сами написали, как это делаете.
Вы меня окончательно запутали
Добавлено after 3 minutes 8 seconds:
Лично я это делаю тоже с помощью sprintf.
Для совсем ущербных МК, как вариант, можно и деление на 10 с остатком применить.
Вы меня окончательно запутали
Добавлено after 3 minutes 8 seconds:
Лично я это делаю тоже с помощью sprintf.
Для совсем ущербных МК, как вариант, можно и деление на 10 с остатком применить.
ROMan2947 писал(а):пример кода преобразования числа long в строку можно в лоб, да так, чтобы в элементы массива поместить каждую цифру числа поотдельности
Код: Выделить всё
char rezult[16];
long variable = 12345678;
ltoa(variable, rezult, 10);
// в массиве rezult символы указанного числа в виде строкида, дополню сообщение : как и Alex, я тоже предпочел бы sprintf, если русурсов достаточно (флеша хотя бы 4К).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="ARV",url="/forum/viewtopic.php?p=3670115#p3670115"]ltoa(variable, rezult, 10);[/uquote] ну если б я знал про это, а знал я только про itoa, то воще вопросов не было бы 
надо знать инструментарий, с которым работаешь, без этого никакROMan2947 писал(а):если б я знал про это
интересно другое: как вы, не зная "этого" умудрялись ВЫВОДИТЬ такое число на дисплей? можете показать код?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3670120#p3670120"]ну если б я знал про это, а знал я только про itoa, то воще вопросов не было бы
[/uquote]
Это же аббревиатура
Int To Ascii 
Соответственно, ltoa - long to ascii
Это же аббревиатура
Соответственно, ltoa - long to ascii
[uquote="ARV",url="/forum/viewtopic.php?p=3670115#p3670115"]если русурсов достаточно (флеша хотя бы 4К).[/uquote] на эти случаю, решил работать с 64 и 128, так писать оптимально мне ещё далеко,так камешки должны вместить в себя всю лабуду, которую я готовлю для них 
Добавлено after 2 minutes 16 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3670125#p3670125"][
интересно другое: как вы, не зная "этого" умудрялись ВЫВОДИТЬ такое число на дисплей? можете показать код?[/uquote]
вечером, после работы выложу
Добавлено after 2 minutes 16 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3670125#p3670125"][
интересно другое: как вы, не зная "этого" умудрялись ВЫВОДИТЬ такое число на дисплей? можете показать код?[/uquote]
вечером, после работы выложу
Заодно, если не сложно, покажите как сделали редактирование разрядов другим способом.
Хочется посмотреть на это извращение
Хочется посмотреть на это извращение
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="Аlex",url="/forum/viewtopic.php?p=3670133#p3670133"]Заодно, если не сложно, покажите как сделали редактирование разрядов другим способом.
Хочется посмотреть на это извращение
[/uquote]
AVR давно не занимаюсь, но не поленился, создал проект для tiny13 и написал две функции, хотя проверить в работе на AVR не могу, только сравнить размер
Сначала с массивом:
Теперь без массива:
Компилируем оба варианта на gcc с -Os, во втором случае размер меньше на 142 байта, при этом очевидно вторая функция и быстрее. Правда она возвращает только число, строки нет, собственно строка может и не понадобиться или какой-нибудь printf задействует свое преобразование, не вызывая atol, но даже дополнительно добавив atol все равно размер будет чуть меньше. Но это не все, второй подход позволяет очень просто добавлять ограничения, например, можно передавать максимум, внутри изменится лишь одна строка:
Все, 4 младших разряда можно увеличивать, 4 старших уже нельзя.
Хочется посмотреть на это извращение
AVR давно не занимаюсь, но не поленился, создал проект для tiny13 и написал две функции, хотя проверить в работе на AVR не могу, только сравнить размер
Код: Выделить всё
char result[16];
uint32_t replaceDigit(uint32_t value, uint8_t idx, uint8_t upDown)
{
ltoa(value, result, 10);
uint8_t digit = result[idx];
if (upDown == 1 && digit < '9') digit++;
if (upDown == 0 && digit > '0') digit--;
return atol(result);
}
volatile uint32_t val_ = 87'654'321;
uint32_t val = val_;
val_ = replaceDigit(val, 2, 1);Код: Выделить всё
uint32_t replaceDigit(uint32_t value, uint8_t idx, uint8_t upDown)
{
static const uint32_t tbl[] = { 1, 10, 100, 1000, 10'000, 100'000, 1'000'000, 10'000'000 };
uint32_t pval = tbl[idx];
uint8_t digit = value / pval % 10;
if (upDown == 1 && digit < 9) value += pval;
if (upDown == 0 && digit > 0) value -= pval;
return value;
}Код: Выделить всё
if (upDown == 1 && digit < 9 && value + pval <= maxValue) value += pval;
.....
val = replaceDigit(val, 2, 1, 87'657'654);- Сообщения: 1840
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="ARV",url="/forum/viewtopic.php?p=3669835#p3669835"]это может и не проще, но правильнее по логике. а для float ваш алгоритм тоже подойдет? мой - да.[/uquote]
"Мой", "ваш" - в чём разница? И там и там - выделение цифр с помощью операций деления/умножения. Только в "вашем" - все цифры выделяются (и ненужные тоже), в "моём" - только нужная.
"Правильнее по-логике" - это делать ненужную работу что-ль?
"Мой", "ваш" - в чём разница? И там и там - выделение цифр с помощью операций деления/умножения. Только в "вашем" - все цифры выделяются (и ненужные тоже), в "моём" - только нужная.
"Правильнее по-логике" - это делать ненужную работу что-ль?
Кстати, во всём это есть один интересный момент. Если некий разряд (при, допустим, вращении энкодера), переходит из 9 в 0, нужно ли при этом разряд слева тоже увеличивать? Если нужно, то все эти свистопляски с строковым представлением сильно всё усложняют.
Имхо, лучше инкрементировать само число. Это, как правило, проще, и нужно чаще, чем показ пользователю. Например, данные приходят от какого-то датчика очень часто, а вывод на экран - на порядок реже. Гораздо проще и быстрее работать с одной сущностью - числом, а уже все преобразования в строку для показа пользователем делать только когда это нужно, т.е. при выводе.
Имхо, лучше инкрементировать само число. Это, как правило, проще, и нужно чаще, чем показ пользователю. Например, данные приходят от какого-то датчика очень часто, а вывод на экран - на порядок реже. Гораздо проще и быстрее работать с одной сущностью - числом, а уже все преобразования в строку для показа пользователем делать только когда это нужно, т.е. при выводе.
Последний раз редактировалось WiseLord Пн июл 22, 2019 12:28:23, всего редактировалось 1 раз.


