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

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

Сообщение ROMan2947 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3669262#p3669262"]А если число будет 87654321, то прочитав младший байт получишь 177, и что с ним потом делать? :)[/uquote] :shock: :o :kill: короче я так понял,что это число лучше не бомбить на отдельные цифры.будем прибавлять и отнимать лучше десятки, сотни,тысячи....так думаю правильнее
Реклама
Мудрый кот
Сообщения: 1773
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3669249#p3669249"]считав один байт я получу
78 или 0x4E. т.е. два разряда 7 и 8, которые я должен редактировать отдельно. а после все это надо еще собрать в единое число[/uquote]
В бинарных числах нет никакой связи между десятичными цифрами и байтами. То что Вы пишете справедливо лишь для BCD-чисел. Если у Вас такие числа, то да - так можно.

Добавлено after 1 minute 1 second:
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3669264#p3669264"]короче я так понял,что это число лучше не бомбить на отдельные цифры.будем прибавлять и отнимать лучше десятки, сотни,тысячи....так думаю правильнее[/uquote]
Почему? Я же приводил процедуру как это делается. Чем не устраивает?
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

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

Сообщение ARV »

Человек оперирует символами. Поэтому, когда человек должен изменить число, надо делать так, как удобно человеку, и не парить моск. Тем более что на экране число уже в виде символов.
Лучший совет был уже дан: перевести в строку, отредактировать посимвольно, и перевести в число обратно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3669436#p3669436"]Человек оперирует символами. Поэтому, когда человек должен изменить число, надо делать так, как удобно человеку, и не парить моск. Тем более что на экране число уже в виде символов.
Лучший совет был уже дан: перевести в строку, отредактировать посимвольно, и перевести в число обратно.[/uquote]
Год назад была похожая тема, я тогда предлагал подход как у jcxz, в итоге ТС послушал остальных, тебя в том числе, и накатал функцию с массивом, в несколько раз большую по размеру, на порядок более медленную и весьма сомнительно, что хотя бы более понятную. По крайней мере у меня было явное сравнение с 60'000, т.к. это максимальное значение, а в другом варианте оно было поразрядно размазано по коду.
Реклама
Мудрый кот
Сообщения: 1773
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3669319#p3669319"]синтаксис интересный у Вашего кода,это в чем так пишется?[/uquote]
В смысле? Это си. Под 32-битный компилятор.
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Сделал по методу jcxz, работает, да и понятно очень. Тем более вспомнилось, как-то по книге решал подобную задачу. С символами я бы запутался думаю.

Добавлено after 2 minutes 40 seconds:
[uquote="jcxz",url="/forum/viewtopic.php?p=3669722#p3669722"]В смысле? Это си. Под 32-битный компилятор.[/uquote]
в смысле, что вставил код в студию, а там часть типов неизвестны.
Мудрый кот
Сообщения: 1773
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="ARV",url="/forum/viewtopic.php?p=3669436#p3669436"]Человек оперирует символами. Поэтому, когда человек должен изменить число, надо делать так, как удобно человеку, и не парить моск. Тем более что на экране число уже в виде символов.[/uquote]
Ну да - автору нужно изменить всего одну цифру, и для этого нужно будет выделить память, разобрать всё число на символы (много команд деления или умножения), изменить символ, потом обратно - собрать число из символов. И это - проще??? :facepalm:
Весь этот огород из кучи лишних операций вместо того, чтобы сделать только нужные операции - несколько делений/умножений.

PS: Впрочем это дело ТСа - ему виднее как ему удобнее. Может сделать и так и так.

Добавлено after 2 minutes 48 seconds:
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3669725#p3669725"]в смысле, что вставил код в студию, а там часть типов неизвестны.[/uquote]
Ну не люблю я эти длинные uint32_t и т.п. которых в программе будет куча. :) Поэтому определил свой набор:

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

typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef unsigned long long ulonglong;
typedef signed long long longlong;
typedef signed char s8;
typedef signed short s16;
typedef signed long s32;
typedef signed long long s64;
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
typedef unsigned long long u64;
Думаю они интуитивно понятны. Макрос ncell(), который у меня тоже повсеместно используется - я привёл его содержимое. assert() - вещь стандартная. А вроде больше там ничего необычного нет.... :dont_know:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 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 в строку можно в лоб, да так, чтобы в элементы массива поместить каждую цифру числа поотдельности
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 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 и на вывод
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 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]да, любопытно посмотреть
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

Добавлено after 3 minutes 8 seconds:
Лично я это делаю тоже с помощью sprintf.
Для совсем ущербных МК, как вариант, можно и деление на 10 с остатком применить.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 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К).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

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