реклама на сайте
подробности

 
 
> Редактирование значения типа float, Как организовать такое?
clpe
сообщение Feb 11 2009, 20:48
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 71
Регистрация: 23-10-08
Из: Набережные Челны
Пользователь №: 41 132



Есть символьный ЖКИ Winstar 20x2, и пять кнопок (вперед, назад, вверх, вниз и ввод) необходимо редактировать значение типа float с двумя знаками после точки. Значение отображается на экране (при нажатии вперед-назад курсор должен перейти на следующее знакоместо числа, а при нажатии на вверх-вниз должен поменять значение цифры. Может кто проделывал уже такое, подскажите пожалуйста. 1111493779.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alex11
сообщение Feb 11 2009, 20:54
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



А в чем проблема? Чтобы все не сбивалось на экране, хранить придется все равно байт на символ (минимум, пол-байта, если памяти совсем нет), изменять их по стрелочкам, а затем пересчитывать в плавучку, умножая каждую цифру на соответствующий множитель (при каждом нажатии стрелочки вверх или вниз).
Go to the top of the page
 
+Quote Post
clpe
сообщение Feb 11 2009, 21:00
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 71
Регистрация: 23-10-08
Из: Набережные Челны
Пользователь №: 41 132



Цитата(Alex11 @ Feb 11 2009, 23:54) *
А в чем проблема? Чтобы все не сбивалось на экране, хранить придется все равно байт на символ (минимум, пол-байта, если памяти совсем нет), изменять их по стрелочкам, а затем пересчитывать в плавучку, умножая каждую цифру на соответствующий множитель (при каждом нажатии стрелочки вверх или вниз).

а алгоритм можете привести? свободной памяти много...

Сообщение отредактировал clpe - Feb 11 2009, 21:01
Go to the top of the page
 
+Quote Post
Methane
сообщение Feb 11 2009, 21:24
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(clpe @ Feb 11 2009, 23:00) *
а алгоритм можете привести? свободной памяти много...

Я делал. Просто вверх/вниз, увеличение скорости изменения по экспоненте (чем дольше нажатие тем быстрее изменяется, в зависимости от текущего значения - если к примеру текущее 0.01 то следующем будет 0.02 а если текущее 100, то 101). Получилось очень прикольно. Но я на семисегментниках делал. На ЖКИ может не так прикольно получится.
Go to the top of the page
 
+Quote Post
clpe
сообщение Feb 11 2009, 21:26
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 71
Регистрация: 23-10-08
Из: Набережные Челны
Пользователь №: 41 132



Цитата(Methane @ Feb 12 2009, 00:24) *
Я делал. Просто вверх/вниз, увеличение скорости изменения по экспоненте (чем дольше нажатие тем быстрее изменяется, в зависимости от текущего значения - если к примеру текущее 0.01 то следующем будет 0.02 а если текущее 100, то 101). Получилось очень прикольно. Но я на семисегментниках делал. На ЖКИ может не так прикольно получится.

Ага прикольно когда надо редактировать от 0.00 до 999.99
Go to the top of the page
 
+Quote Post
Methane
сообщение Feb 11 2009, 21:28
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(clpe @ Feb 11 2009, 23:26) *
Ага прикольно когда надо редактировать от 0.00 до 999.99

Так ведь оно щелкает все быстрее и быстрее. Очень быстро получается. Чем дольше жмеш, тем быстрее оно переключается. smile.gif
Go to the top of the page
 
+Quote Post
nl5
сообщение Feb 11 2009, 21:34
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 175
Регистрация: 7-02-09
Пользователь №: 44 515



Цитата(Methane @ Feb 11 2009, 14:28) *
Так ведь оно щелкает все быстрее и быстрее. Очень быстро получается. Чем дольше жмеш, тем быстрее оно переключается. smile.gif

...и тем труднее остановиться когда надо, и начинается: вверх-вниз-вверх-вниз.. rolleyes.gif
Иногда делают просто выбор позиции стрелками вправо-влево, и изменение этой позиции стрелками вверх-вниз, с переносом в старшую позицию если переполняется вверх или вниз. По-моему это удобнее, чем переменная скорость, хотя кому как.
Go to the top of the page
 
+Quote Post
clpe
сообщение Feb 11 2009, 21:39
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 71
Регистрация: 23-10-08
Из: Набережные Челны
Пользователь №: 41 132



Цитата(nl5 @ Feb 12 2009, 00:34) *
Иногда делают просто выбор позиции стрелками вправо-влево, и изменение этой позиции стрелками вверх-вниз, с переносом в старшую позицию если переполняется вверх или вниз. По-моему это удобнее, чем переменная скорость, хотя кому как.

вот-вот такое есть у кого нибудь?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 11 2009, 22:19
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Преобразуйте число в строку функцией ftoa или snprintf или dtostrf, отредактируйте строку кнопочкми и обратно из строки в число atof.
Какой алгоритм Вам ещё нужен? Вы же программист и творец, вот и творите, экспериментируйте...
Нет ничего более ценного, чем знания и опыт, полученные собственным трудом.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 12 2009, 21:33
Сообщение #10


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(demiurg_spb @ Feb 12 2009, 01:19) *
Преобразуйте число в строку функцией ftoa или snprintf или dtostrf, отредактируйте строку кнопочкми и обратно из строки в число atof.

ИМХО, если уж все равно присутствует плавучка, то совсем не нужно конвертировать туда-сюда,
достаточно только конвертировать для вывода.
А редактирование делать примерно так:
Код
const float vinput_delta[9] =   // шаги приращения для ввода
{0.0001f, 0.001f, 0.01f, 0.1f, 1.0f, 10.0f, 100.0f, 1000.0f, 10000.0f};
unsigned char vinput_step; // текущий N шага при редактировании в таблице vinput_delta
................
  vinput_data -= vinput_delta[vinput_step]; // уменьшить на текущий шаг(кнопка вниз)
...............
  vinput_data += vinput_delta[vinput_step]; // увеличить на текущий шаг(кнопка вверх)
...............
  vinput_step++; // к старшему разряду(кнопка влево)
..............
  vinput_step--; // к младшему разряду(кнопка вправо)
Это конечно упрощенно, но идея я думаю ясна.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 13 2009, 08:37
Сообщение #11


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(singlskv @ Feb 13 2009, 00:33) *
ИМХО, если уж все равно присутствует плавучка, то совсем не нужно конвертировать туда-сюда,
достаточно только конвертировать для вывода.
А редактирование делать примерно так:
[code]const float vinput_delta[9] = // шаги приращения для ввода
{0.0001f, 0.001f, 0.01f, 0.1f, 1.0f, 10.0f, 100.0f, 1000.0f, 10000.0f};
...
Это конечно упрощенно, но идея я думаю ясна.
Идея-то ясна но, у float в отличие от целочисленных типов есть очень серьёзный недостаток. И заключается он в том, что точного значения числа часто не существует, а есть лишь его приближённая величина. И если прибавлять 0,1 к нулю много-много раз, можно получить что-то подобное 999999,371654651. Этим плох Ваш способ. Не смертельно плох, но всёже...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 13 2009, 08:41
Сообщение #12


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(demiurg_spb @ Feb 13 2009, 11:37) *
И если прибавлять 0,1 к нулю много-много раз, можно получить что-то подобное 999999,371654651. Этим плох Ваш способ. Не смертельно плох, но всёже...
А когда редактируешь строку и потом переводишь в флоат разьве точность не теряется ?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 13 2009, 11:57
Сообщение #13


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(singlskv @ Feb 13 2009, 11:41) *
А когда редактируешь строку и потом переводишь в флоат разьве точность не теряется ?

Даже если она и "теряется", но лишь единожды, а у Вас на каждое нажатие кнопки.
По моему скромному мнению, при помощи atof достигается максимальная точность из возможных...
И уж не хуже чем при целочисленном способе редактирования. В этом смысле Ваш вариант самый неудачный.
atof - ведь библиотечная функция и отшлифована она не одним поколением программистов, поэтому недоверия у меня она никогда не вызывает.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 13 2009, 16:28
Сообщение #14


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(demiurg_spb @ Feb 13 2009, 14:57) *
Даже если она и "теряется", но лишь единожды, а у Вас на каждое нажатие кнопки.
По моему скромному мнению, при помощи atof достигается максимальная точность из возможных...
И уж не хуже чем при целочисленном способе редактирования. В этом смысле Ваш вариант самый неудачный.
atof - ведь библиотечная функция и отшлифована она не одним поколением программистов, поэтому недоверия у меня она никогда не вызывает.
Ну давайте рассмотрим такой пример на Вашем алгоритме:
Было число 1.44999999
Выводим с одним разрядом после запятой: 1.4
хотим уменьшить это число на 1 минимальный шаг(типа чего-нить регулируем)
жмем кнопку вниз на младшем разряде
получаем: 1.3
жмем ввод
ИТОГО: было 1.44999999 стало 1.3
вместо регулирования на 0.1 получили на 0.14999999

Это правильно ? smile.gif
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 13 2009, 16:58
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(singlskv @ Feb 13 2009, 19:28) *
Ну давайте рассмотрим такой пример на Вашем алгоритме:
Было число 1.44999999
Выводим с одним разрядом после запятой: 1.4
хотим уменьшить это число на 1 минимальный шаг(типа чего-нить регулируем)
жмем кнопку вниз на младшем разряде
получаем: 1.3
жмем ввод
ИТОГО: было 1.44999999 стало 1.3
вместо регулирования на 0.1 получили на 0.14999999

Это правильно ? smile.gif

это неправильно. однако, если только один знак после запятой в редактируемом параметре - откуда там возьмется "хвостик"? редактируется, как я понимаю, входной параметр для некоего алгоритма, но никак не выходной, т.е. получаемый в результате вычислений... то есть никакого 1.449999 быть не может (не должно по определению)? может быть только 1.4


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- clpe   Редактирование значения типа float   Feb 11 2009, 20:48
||- - clpe   Цитата(demiurg_spb @ Feb 12 2009, 01:19) ...   Feb 11 2009, 22:27
|||- - demiurg_spb   Цитата(clpe @ Feb 12 2009, 01:27) В редак...   Feb 11 2009, 22:32
||||- - clpe   Цитата(demiurg_spb @ Feb 12 2009, 01:32) ...   Feb 11 2009, 22:34
||||- - MrYuran   Цитата(clpe @ Feb 12 2009, 01:34) Просто ...   Feb 12 2009, 05:14
|||- - rezident   Цитата(clpe @ Feb 12 2009, 03:27) В редак...   Feb 12 2009, 00:17
|||- - clpe   Цитата(rezident @ Feb 12 2009, 03:17) При...   Feb 12 2009, 10:37
|||- - _Pasha   Цитата(clpe @ Feb 12 2009, 13:37) "П...   Feb 12 2009, 10:50
|||- - clpe   Цитата(_Pasha @ Feb 12 2009, 13:50) В пре...   Feb 12 2009, 10:56
||- - SysRq   Цитата(singlskv @ Feb 13 2009, 00:33) Код...   Feb 12 2009, 23:38
||- - _Pasha   Цитата(singlskv @ Feb 13 2009, 01:33) Это...   Feb 13 2009, 07:12
|||- - singlskv   Цитата(_Pasha @ Feb 13 2009, 10:12) Там г...   Feb 13 2009, 07:32
|||- - _Pasha   Цитата(singlskv @ Feb 13 2009, 11:32) Ну ...   Feb 13 2009, 07:53
|||- - singlskv   Цитата(_Pasha @ Feb 13 2009, 10:53) В общ...   Feb 13 2009, 08:03
||- - singlskv   Цитата(ARV @ Feb 13 2009, 19:58) это непр...   Feb 13 2009, 17:52
|- - Methane   Цитата(nl5 @ Feb 11 2009, 23:34) ...и тем...   Feb 11 2009, 23:34
- - Dog Pawlowa   Цитата(clpe @ Feb 11 2009, 23:48) необход...   Feb 13 2009, 07:32
|- - MrYuran   Цитата(Dog Pawlowa @ Feb 13 2009, 10:32) ...   Feb 13 2009, 07:40
|- - singlskv   Цитата(Dog Pawlowa @ Feb 13 2009, 10:32) ...   Feb 13 2009, 07:47
- - ARV   для редактирования float с заранее известным число...   Feb 13 2009, 09:12
|- - _Pasha   Цитата(ARV @ Feb 13 2009, 13:12) минусы: ...   Feb 13 2009, 09:21
|- - Сергей Борщ   Цитата(ARV @ Feb 13 2009, 11:12) минусы: ...   Feb 13 2009, 10:52
|- - _Pasha   Цитата(Сергей Борщ @ Feb 13 2009, 14:52) ...   Feb 13 2009, 11:42
- - _Pasha   А чтоб не спорить, должно быть правило: система па...   Feb 13 2009, 17:58
- - singlskv   Цитата(_Pasha @ Feb 13 2009, 20:58) А что...   Feb 13 2009, 18:13
- - _Pasha   Цитата(singlskv @ Feb 13 2009, 21:13) Ok,...   Feb 13 2009, 18:21
- - singlskv   Цитата(_Pasha @ Feb 13 2009, 21:21) В так...   Feb 13 2009, 18:30
- - _Pasha   Цитата(singlskv @ Feb 13 2009, 21:30) пол...   Feb 13 2009, 18:39
- - singlskv   Цитата(_Pasha @ Feb 13 2009, 21:39) Отред...   Feb 13 2009, 18:53
- - ARV   Цитата(_Pasha @ Feb 13 2009, 21:39) Отред...   Feb 13 2009, 18:54
- - clpe   Цитата(ARV @ Feb 13 2009, 21:54) +5! ...   Feb 13 2009, 22:00


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 02:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.0159 секунд с 7
ELECTRONIX ©2004-2016