Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="jcxz",url="/forum/viewtopic.php?p=3669729#p3669729"]Поэтому определил свой набор[/uquote]я так и предположил :roll:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

jcxz писал(а):И это - проще???
это может и не проще, но правильнее по логике. а для float ваш алгоритм тоже подойдет? мой - да. заодно мой алгоритм подойдет и для ввода дней недели в символьном виде, и для месяца и для чего угодно - преобразуем из машинно-удобного вида в человеко-удобный, правим ПОСИМВОЛЬНО, затем обратно в машинно-удобный вид. первый и последний этап делается стандартными библиотечными функциями типа atoi-itoa, весь труд в написании посимвольного редактора строки для ограниченного набора символов. собственно, в самом простом случае это сводится к двум операторам if

Код: Выделить всё

if(str[cur_pos] > MAX_SYMBOL) str[cur_pos] = MIN_SYMBOL;
if(str[cur_pos] < MIN_SYMBOL) str[cur_pos] = MAX_SYMBOL;
при таком подходе редактирование состоит только в изменении на 1 str[cur_pos] в большую или меньшую сторону, да изменению самой cur_pos - обе задачи элементарно делаются в обработчиках нажатий кнопки.

разумеется, для более сложных задач типа редактирования float надо корректно отслеживать изменения cur_pos, чтобы не начать править "точку" или "Е" - но это нюансы...


что касается простоты, то задаю провокационный вопрос: а зачем тогда мощность МК, если надо делать "как проще", а не как удобнее или красивее? боитесь, что МК перегреется?

Добавлено after 4 minutes 10 seconds:
P.S. самое интересное, что обработку нажатий кнопки, отслеживание (и показ) положения "курсора" и т.п. - все и так необходимо делать. Причем переводить число в символьный вид тоже, ведь человеку надо видеть, что он ввёл :) И ваша математика, какая бы логичная и красивая она ни была, тут совсем не уместна.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Тут вопрос только в том, что у вас в дефиците - RAM, FLASH или вычислительная мощность. Если всего в достатке, то пофиг как делать, лишь бы правильно. Я бы редактировал и параллельно отображал строку, а в реальное значение пересчитывал только когда надо это значение применить или проверить на диапазон.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

jcxz писал(а):Ну да - автору нужно изменить всего одну цифру, .... бла-бла-бла ...
Где одну то ? Ему нужно изменить число, состоящее из нескольких цифр !
Делать itoa (или ему подобное) для вывода на дисплей, а потом по индексу вычислять разряд, изменяя число на 1/10/100/1000/... - это проще ? Шутишь ? :facepalm:

[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++;
	//  Тут проверка на перепонение индекса и выход из редактирования
}

................
................
Ну и что тут сложного и запутанного ?
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="Аlex",url="/forum/viewtopic.php?p=3670077#p3670077"][
Ну и что тут сложного и запутанного ?[/uquote]я понял Вашу мысль, запутался бы наверное я в своей писание, поскольку там много всего всякого нагородил. и не совсем было понятно как реализовать все эти преобразования, без последствий всего кода

Добавлено after 8 minutes 1 second:
пример кода преобразования числа long в строку можно в лоб, да так, чтобы в элементы массива поместить каждую цифру числа поотдельности
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ROMan2947 писал(а):пример кода преобразования числа long в строку можно в лоб
Эм... А как Вы выводите своё число на дисплей (ну или на чём Вы там редактируете) ?
Без преобразования его в строку, это сделать невозможно. По крайней мере, я не знаю как это можно сделать по-другому :dont_know:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="Аlex",url="/forum/viewtopic.php?p=3670097#p3670097"]А как Вы выводите своё число на дисплей[/uquote] разбивают на отдельные цифры их в массив, после sprintf и на вывод
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Тогда я Вас не понял. Вот это : [uquote="ROMan2947",url="/forum/viewtopic.php?p=3670091#p3670091"]пример кода преобразования числа long в строку можно в лоб, да так, чтобы в элементы массива поместить каждую цифру числа поотдельности[/uquote] что было ? Просьба показать код ?
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="Аlex",url="/forum/viewtopic.php?p=3670103#p3670103"]Просьба показать код ?[/uquote]да, любопытно посмотреть
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Дак Вы же сами написали, как это делаете.
Вы меня окончательно запутали :)

Добавлено after 3 minutes 8 seconds:
Лично я это делаю тоже с помощью sprintf.
Для совсем ущербных МК, как вариант, можно и деление на 10 с остатком применить.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ROMan2947 писал(а):пример кода преобразования числа long в строку можно в лоб, да так, чтобы в элементы массива поместить каждую цифру числа поотдельности

Код: Выделить всё

char rezult[16];
long variable = 12345678;
ltoa(variable, rezult, 10);
// в массиве rezult символы указанного числа в виде строки
Добавлено after 1 minute 21 second:
да, дополню сообщение : как и Alex, я тоже предпочел бы sprintf, если русурсов достаточно (флеша хотя бы 4К).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="ARV",url="/forum/viewtopic.php?p=3670115#p3670115"]ltoa(variable, rezult, 10);[/uquote] ну если б я знал про это, а знал я только про itoa, то воще вопросов не было бы :roll:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ROMan2947 писал(а):если б я знал про это
надо знать инструментарий, с которым работаешь, без этого никак

интересно другое: как вы, не зная "этого" умудрялись ВЫВОДИТЬ такое число на дисплей? можете показать код?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3670120#p3670120"]ну если б я знал про это, а знал я только про itoa, то воще вопросов не было бы :roll:[/uquote]
Это же аббревиатура :) Int To Ascii :)

Соответственно, ltoa - long to ascii :)
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="ARV",url="/forum/viewtopic.php?p=3670115#p3670115"]если русурсов достаточно (флеша хотя бы 4К).[/uquote] на эти случаю, решил работать с 64 и 128, так писать оптимально мне ещё далеко,так камешки должны вместить в себя всю лабуду, которую я готовлю для них :hunger:

Добавлено after 2 minutes 16 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3670125#p3670125"][
интересно другое: как вы, не зная "этого" умудрялись ВЫВОДИТЬ такое число на дисплей? можете показать код?[/uquote]
вечером, после работы выложу
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Заодно, если не сложно, покажите как сделали редактирование разрядов другим способом.
Хочется посмотреть на это извращение :)
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Аlex",url="/forum/viewtopic.php?p=3670133#p3670133"]Заодно, если не сложно, покажите как сделали редактирование разрядов другим способом.
Хочется посмотреть на это извращение :)[/uquote]
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;
}
Компилируем оба варианта на gcc с -Os, во втором случае размер меньше на 142 байта, при этом очевидно вторая функция и быстрее. Правда она возвращает только число, строки нет, собственно строка может и не понадобиться или какой-нибудь printf задействует свое преобразование, не вызывая atol, но даже дополнительно добавив atol все равно размер будет чуть меньше. Но это не все, второй подход позволяет очень просто добавлять ограничения, например, можно передавать максимум, внутри изменится лишь одна строка:

Код: Выделить всё

if (upDown == 1 && digit < 9 && value + pval <= maxValue)  value += pval;
.....

     val = replaceDigit(val, 2, 1, 87'657'654);
Все, 4 младших разряда можно увеличивать, 4 старших уже нельзя.
Мудрый кот
Сообщения: 1840
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="ARV",url="/forum/viewtopic.php?p=3669835#p3669835"]это может и не проще, но правильнее по логике. а для float ваш алгоритм тоже подойдет? мой - да.[/uquote]
"Мой", "ваш" - в чём разница? И там и там - выделение цифр с помощью операций деления/умножения. Только в "вашем" - все цифры выделяются (и ненужные тоже), в "моём" - только нужная.
"Правильнее по-логике" - это делать ненужную работу что-ль? :dont_know:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Кстати, во всём это есть один интересный момент. Если некий разряд (при, допустим, вращении энкодера), переходит из 9 в 0, нужно ли при этом разряд слева тоже увеличивать? Если нужно, то все эти свистопляски с строковым представлением сильно всё усложняют.

Имхо, лучше инкрементировать само число. Это, как правило, проще, и нужно чаще, чем показ пользователю. Например, данные приходят от какого-то датчика очень часто, а вывод на экран - на порядок реже. Гораздо проще и быстрее работать с одной сущностью - числом, а уже все преобразования в строку для показа пользователем делать только когда это нужно, т.е. при выводе.
Последний раз редактировалось WiseLord Пн июл 22, 2019 12:28:23, всего редактировалось 1 раз.
Контактная информация:
Ответить

Вернуться в «Разные вопросы по МК»