|
|
  |
Редактирование значения типа float, Как организовать такое? |
|
|
|
Feb 12 2009, 10:37
|

Участник

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

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

Участник

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

|
Цитата(_Pasha @ Feb 12 2009, 13:50)  В предельном случае - когда у Вас всего две кнопки (не смейтесь над функционалом) - изменение текущего символа по отпусканию кнопки, автоповтора ессно нету, переход по знакоместам по нажатию двух кнопок. В этом случае отпускание кнопки не влечет за собой изменение символа. Бывали и такие случаи (заказчик ругался, что слишком долго редактировать приходится: в приборе 2 кнопки, а при сдаче прибора выяснилось, что надо редактировать значение от 100 до 10000, а не от 900 до 1000 как он говорил до этого) спасибо возьму на заметку.
|
|
|
|
|
Feb 12 2009, 21:33
|
дятел
    
Группа: Свой
Сообщений: 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--; // к младшему разряду(кнопка вправо) Это конечно упрощенно, но идея я думаю ясна.
|
|
|
|
|
Feb 12 2009, 23:38
|

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

|
Цитата(singlskv @ Feb 13 2009, 00:33)  Код const float vinput_delta[9] Ну это уже совсем того! Редактировать надо строку, о чем выше сказано. А в случае если у автора задача стоит так, что значение меняется только в меню и нигде больше, то операция float->строка вообще не нужна: хранить строку, изменять ее в меню (редактировать просто, выводить на экран просто), и операция строка->float по завершению редактирования для дальнейшего использования.
Сообщение отредактировал SysRq - Feb 13 2009, 00:11
|
|
|
|
|
Feb 13 2009, 07:32
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(_Pasha @ Feb 13 2009, 10:12)  Там главный недостаток - перенос наших "разрядов" в соседние, например 0.09f+0.01f=0.1f Ну никто же не мешает при этом выводить 0.10 В конце концов, обычно, нужно фиксированное кол-во разрядов после запятой. Цитата За этой "ловлей блох" можно потерять немало флеша. А если очень надо, то и пересчитать положение точки при выводе не проблема, и флеша это займет очень не много...
|
|
|
|
|
Feb 13 2009, 07:47
|
дятел
    
Группа: Свой
Сообщений: 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};
|
|
|
|
|
Feb 13 2009, 08:37
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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. Этим плох Ваш способ. Не смертельно плох, но всёже...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 13 2009, 09:12
|

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

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