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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Редактирование значения типа float, Как организовать такое?
clpe
сообщение Feb 12 2009, 10:37
Сообщение #16


Участник
*

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



Цитата(rezident @ Feb 12 2009, 03:17) *
При посимвольном редактировании кнопки влево/вправо двигают курсор по символам(знакоместам), а вверх/вниз изменяют значение символа из следующего ряда: "пробел", ".", "0", "1", "2", .... "8", "9".

"Пробел", ".", блин а так действительно легче!
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 12 2009, 10:50
Сообщение #17


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(clpe @ Feb 12 2009, 13:37) *
"Пробел", ".", блин а так действительно легче!

В предельном случае - когда у Вас всего две кнопки (не смейтесь над функционалом) - изменение текущего символа по отпусканию кнопки, автоповтора ессно нету, переход по знакоместам по нажатию двух кнопок. В этом случае отпускание кнопок не влечет за собой изменение символа.
Go to the top of the page
 
+Quote Post
clpe
сообщение Feb 12 2009, 10:56
Сообщение #18


Участник
*

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



Цитата(_Pasha @ Feb 12 2009, 13:50) *
В предельном случае - когда у Вас всего две кнопки (не смейтесь над функционалом) - изменение текущего символа по отпусканию кнопки, автоповтора ессно нету, переход по знакоместам по нажатию двух кнопок. В этом случае отпускание кнопки не влечет за собой изменение символа.

Бывали и такие случаи (заказчик ругался, что слишком долго редактировать приходится: в приборе 2 кнопки, а при сдаче прибора выяснилось, что надо редактировать значение от 100 до 10000, а не от 900 до 1000 как он говорил до этого) спасибо возьму на заметку.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 12 2009, 21:33
Сообщение #19


дятел
*****

Группа: Свой
Сообщений: 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
SysRq
сообщение Feb 12 2009, 23:38
Сообщение #20


Чайник, 1 литр
****

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



Цитата(singlskv @ Feb 13 2009, 00:33) *
Код
const float vinput_delta[9]

Ну это уже совсем того! laughing.gif
Редактировать надо строку, о чем выше сказано.
А в случае если у автора задача стоит так, что значение меняется только в меню и нигде больше, то операция float->строка вообще не нужна: хранить строку, изменять ее в меню (редактировать просто, выводить на экран просто), и операция строка->float по завершению редактирования для дальнейшего использования.

Сообщение отредактировал SysRq - Feb 13 2009, 00:11
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 13 2009, 07:12
Сообщение #21


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(singlskv @ Feb 13 2009, 01:33) *
Это конечно упрощенно, но идея я думаю ясна.


Там главный недостаток - перенос наших "разрядов" в соседние, например 0.09f+0.01f=0.1f


За этой "ловлей блох" можно потерять немало флеша.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 13 2009, 07:32
Сообщение #22


дятел
*****

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



Цитата(_Pasha @ Feb 13 2009, 10:12) *
Там главный недостаток - перенос наших "разрядов" в соседние, например 0.09f+0.01f=0.1f
Ну никто же не мешает при этом выводить 0.10
В конце концов, обычно, нужно фиксированное кол-во разрядов после запятой.
Цитата
За этой "ловлей блох" можно потерять немало флеша.
А если очень надо, то и пересчитать положение точки при выводе не проблема,
и флеша это займет очень не много...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 13 2009, 07:32
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(clpe @ Feb 11 2009, 23:48) *
необходимо редактировать значение типа float с двумя знаками после точки

Если это значение всегда с двумя знаками после точки, то это не float. Представьте, что оно целое, равно float * 100, с точкой между третьим и вторым знаками слева.
Такой подсказки достаточно?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 13 2009, 07:40
Сообщение #24


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Dog Pawlowa @ Feb 13 2009, 10:32) *
Если это значение всегда с двумя знаками после точки, то это не float. Представьте, что оно целое, равно float * 100, с точкой между третьим и вторым знаками слева.
Такой подсказки достаточно?

Всегда так делаем. Очень удобно.
флоат получается при желании путём явного приведения типов


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 13 2009, 07:47
Сообщение #25


дятел
*****

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



Цитата(Dog Pawlowa @ Feb 13 2009, 10:32) *
Если это значение всегда с двумя знаками после точки, то это не float. Представьте, что оно целое, равно float * 100, с точкой между третьим и вторым знаками слева.
Такой подсказки достаточно?
Если точка всегда в одном месте то тогда действительно можно все в целых,
в моем варианте просто меняется:
const float vinput_delta[9] = // шаги приращения для ввода
{0.0001f, 0.001f, 0.01f, 0.1f, 1.0f, 10.0f, 100.0f, 1000.0f, 10000.0f};

на:
const int vinput_delta[] = // шаги приращения для ввода
{1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000,1000000000};
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 13 2009, 07:53
Сообщение #26


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(singlskv @ Feb 13 2009, 11:32) *
Ну никто же не мешает при этом выводить 0.10

Ну, может я не точно выразился... В общем, при переходе 0.09+0.01 должно быть 0.00

Это редактирование, а не урок математики smile.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 13 2009, 08:03
Сообщение #27


дятел
*****

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



Цитата(_Pasha @ Feb 13 2009, 10:53) *
В общем, при переходе 0.09+0.01 должно быть 0.00
Это редактирование, а не урок математики smile.gif
А это уже дело "вкуса" smile.gif
ИМХО, стрелка вверх должна увеличивать число а не уменьшать(иногда).
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 13 2009, 08:37
Сообщение #28


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

Группа: Свой
Сообщений: 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
Сообщение #29


дятел
*****

Группа: Свой
Сообщений: 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
ARV
сообщение Feb 13 2009, 09:12
Сообщение #30


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

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



для редактирования float с заранее известным числом знаков после точки и перед нею, я бы сделал почти так, как предлагал singlskv, только перед началом редактирвоания переводил бы float в целое (для двух знаков после точки - умножением на 100) и редактировал бы именно в целых числах (запрет "переноса разряда" легко и незатратно по памяти реализуется), а точку "пририсовывал" бы только при выводе.
после завершения редактирования деление на 100 (или на что там умножали вначале) - и получите готовое число.

плюсы:
1. функция редактирования любого знака может быть одной для любого разряда: получает "порядок" изменяемого разряда, реализуя контроль и блокировку перехода 9-->10. при этом сама процедура редактирования красиво раскладывается на элементарные действия: выбор разряда - изменение
2. целочисленная арифметика - быстро и экономно
3. не надо делать ресурсоемкие преобразования для вывода float - опять же экономия памяти

минусы:
- назовите сами smile.gif


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

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

 


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


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