Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Сб июл 20, 2019 11:02:46

А если число будет 87654321, то прочитав младший байт получишь 177, и что с ним потом делать? :)
:shock: :o :kill: короче я так понял,что это число лучше не бомбить на отдельные цифры.будем прибавлять и отнимать лучше десятки, сотни,тысячи....так думаю правильнее

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

Сб июл 20, 2019 11:45:37

считав один байт я получу
78 или 0x4E. т.е. два разряда 7 и 8, которые я должен редактировать отдельно. а после все это надо еще собрать в единое число

В бинарных числах нет никакой связи между десятичными цифрами и байтами. То что Вы пишете справедливо лишь для BCD-чисел. Если у Вас такие числа, то да - так можно.

Добавлено after 1 minute 1 second:
короче я так понял,что это число лучше не бомбить на отдельные цифры.будем прибавлять и отнимать лучше десятки, сотни,тысячи....так думаю правильнее

Почему? Я же приводил процедуру как это делается. Чем не устраивает?

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

Сб июл 20, 2019 13:30:16

Почему? Я же приводил процедуру как это делается. Чем не устраивает?
все отлично,я сначала не понял как ее применять,начал мутить свое,но в итоге пришел к тому же, что Вы и привели. синтаксис интересный у Вашего кода,это в чем так пишется?

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

Сб июл 20, 2019 19:09:27

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

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

Вс июл 21, 2019 11:53:40

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

Год назад была похожая тема, я тогда предлагал подход как у jcxz, в итоге ТС послушал остальных, тебя в том числе, и накатал функцию с массивом, в несколько раз большую по размеру, на порядок более медленную и весьма сомнительно, что хотя бы более понятную. По крайней мере у меня было явное сравнение с 60'000, т.к. это максимальное значение, а в другом варианте оно было поразрядно размазано по коду.

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

Вс июл 21, 2019 12:14:08

синтаксис интересный у Вашего кода,это в чем так пишется?

В смысле? Это си. Под 32-битный компилятор.

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

Вс июл 21, 2019 12:21:23

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

Добавлено after 2 minutes 40 seconds:
В смысле? Это си. Под 32-битный компилятор.

в смысле, что вставил код в студию, а там часть типов неизвестны.

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

Вс июл 21, 2019 12:25:57

Человек оперирует символами. Поэтому, когда человек должен изменить число, надо делать так, как удобно человеку, и не парить моск. Тем более что на экране число уже в виде символов.

Ну да - автору нужно изменить всего одну цифру, и для этого нужно будет выделить память, разобрать всё число на символы (много команд деления или умножения), изменить символ, потом обратно - собрать число из символов. И это - проще??? :facepalm:
Весь этот огород из кучи лишних операций вместо того, чтобы сделать только нужные операции - несколько делений/умножений.

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

Добавлено after 2 minutes 48 seconds:
в смысле, что вставил код в студию, а там часть типов неизвестны.

Ну не люблю я эти длинные 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:

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

Вс июл 21, 2019 12:28:36

Поэтому определил свой набор
я так и предположил :roll:

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

Вс июл 21, 2019 16:02:29

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. самое интересное, что обработку нажатий кнопки, отслеживание (и показ) положения "курсора" и т.п. - все и так необходимо делать. Причем переводить число в символьный вид тоже, ведь человеку надо видеть, что он ввёл :) И ваша математика, какая бы логичная и красивая она ни была, тут совсем не уместна.

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

Вс июл 21, 2019 20:21:12

Тут вопрос только в том, что у вас в дефиците - RAM, FLASH или вычислительная мощность. Если всего в достатке, то пофиг как делать, лишь бы правильно. Я бы редактировал и параллельно отображал строку, а в реальное значение пересчитывал только когда надо это значение применить или проверить на диапазон.

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

Пн июл 22, 2019 07:09:55

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

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

Пн июл 22, 2019 09:24:27

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

С символами я бы запутался думаю.
Как можно с ними запутаться, если Вы уже делаете преобразование числа в строку ? А это уже полдела сделано.
Осталось только каждую "циферку" отредактировать по индексу и перевести обратно в число. Всё ! Логично, понятно и правильно !

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

................
................


Ну и что тут сложного и запутанного ?

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

Пн июл 22, 2019 09:41:15

[
Ну и что тут сложного и запутанного ?
я понял Вашу мысль, запутался бы наверное я в своей писание, поскольку там много всего всякого нагородил. и не совсем было понятно как реализовать все эти преобразования, без последствий всего кода

Добавлено after 8 minutes 1 second:
пример кода преобразования числа long в строку можно в лоб, да так, чтобы в элементы массива поместить каждую цифру числа поотдельности

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

Пн июл 22, 2019 09:47:34

ROMan2947 писал(а):пример кода преобразования числа long в строку можно в лоб
Эм... А как Вы выводите своё число на дисплей (ну или на чём Вы там редактируете) ?
Без преобразования его в строку, это сделать невозможно. По крайней мере, я не знаю как это можно сделать по-другому :dont_know:

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

Пн июл 22, 2019 09:51:48

А как Вы выводите своё число на дисплей
разбивают на отдельные цифры их в массив, после sprintf и на вывод

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

Пн июл 22, 2019 09:53:31

Тогда я Вас не понял. Вот это :
пример кода преобразования числа long в строку можно в лоб, да так, чтобы в элементы массива поместить каждую цифру числа поотдельности
что было ? Просьба показать код ?

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

Пн июл 22, 2019 09:57:48

Просьба показать код ?
да, любопытно посмотреть

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

Пн июл 22, 2019 10:02:52

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

Добавлено after 3 minutes 8 seconds:
Лично я это делаю тоже с помощью sprintf.
Для совсем ущербных МК, как вариант, можно и деление на 10 с остатком применить.

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

Пн июл 22, 2019 10:05:58

ROMan2947 писал(а):пример кода преобразования числа long в строку можно в лоб, да так, чтобы в элементы массива поместить каждую цифру числа поотдельности
Код:
char rezult[16];
long variable = 12345678;
ltoa(variable, rezult, 10);
// в массиве rezult символы указанного числа в виде строки


Добавлено after 1 minute 21 second:
да, дополню сообщение : как и Alex, я тоже предпочел бы sprintf, если русурсов достаточно (флеша хотя бы 4К).
Ответить