Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

arik гость
2019-12-15 22:49:48

Kaka, ещё раз спасибо! это реально рабочее решение!
поправил всё на рабочем коде, всё красиво и без глюков!

arik гость
2019-12-15 19:48:12

Kaka респектище!!! сейчас попробую на рабочем коде, но пока 10.00 не появляется... Спасибо!!!  cool

arik гость
2019-12-15 19:34:04

Watchdog - да да, точно что малЮвать!
Kaka - ох не внимательный... сейчас всё перепроверю.

Kaka
2019-12-15 19:25:55

Простите, Вы, наверное устали. Отдохните, потом вернётесь, иначе, простите, но Вы выглядите идиотом.

arik гость пише:

хм... вот ничего не меняю, только в первом сравнении пишу
else if (X<10)        {tft.print(float(int(X*100))/100,2);}
на екране два знака после запятой
ставлю так
else if (X<10)        {tft.print(float(int(X*10))/10,2);}
на экране два знака после запятой

А сколько Вы хотели, если Вы сами написал двойку?

У Вас как раньше было?

else if (X<10)        {tft.print(float(int(X*100))/100,2);}
else if (X<100)        {tft.print(float(int(X*100))/100,1);}

Ну так и напишите по-человечески

else if (X<10)        {tft.print(float(int(X*100))/100,2);}
else if (X<100)        {tft.print(float(int(X*10))/10,1);}

Делов-то!

Watchdog
2019-12-15 19:25:04

К графике нужен подход особый, особенно рисуя фруктовыми соками Ада. Нужно малевать а не печатать! big_smile

arik гость
2019-12-15 19:22:16

да, всё верно, два знака после запятой в обоих вариантах если
else if (X<10)        {tft.print(float(int(X*10))/10,2);}
пишу
else if (X<10)        {tft.print(float(int(X*10))/10,1);}
один знак после запятой

arik гость
2019-12-15 19:11:43

хм... вот ничего не меняю, только в первом сравнении пишу
else if (X<10)        {tft.print(float(int(X*100))/100,2);}
на екране два знака после запятой
ставлю так
else if (X<10)        {tft.print(float(int(X*10))/10,2);}
на экране два знака после запятой

сейчас ещё раз всё проверю...

arik гость
2019-12-15 19:07:38

а ещё возможно проблема в другом... а точнее в Adafruit_GFX.
сейчас специально запустил код с уменьшением значений ровных чисел.
100 - 10 - 1 (не функция а пример уменьшения) так вот, после 100 экран нарисовал 990, после обновления екрана (переход кнопками в другой блок отображения возврат обратно) отрисовала 99, то же самое с цифрой 10, после уменьшения отрисовал 90, после обновления экрана 9.
Пропечатал пробелами через сравнение, рисует правильно.
ещё... пример.
написал увеличение ровных чисел.
1-10-100 - если просто, то рисует так
1
10
100
если пытаюсь через сравнения выставить красиво с пробелами чтоб получилось
   1
  10
100
в результате получаю примерно такое
  1
  10
10
100
опять эта 10.00 в сравнении х<10
wink

Kaka
2019-12-15 18:55:55

Ты ещё и читать не умеешь?
Я же тебе русским языком писал, что "если надо один знак оставить, то заменяй 100 на 10". А у тебя что написано?

else if (X<100)        {tft.print(float(int(X*100))/100,1);}

Это шозанах?

Делай как сказали, только аккуратно. Это стопудово решает твою проблему. Если не получается, значит опять что-то напарил. Всё там должно быть нормально.

arik гость
2019-12-15 18:48:11

хм... а что показывать... так как функция сравнения мне нужна, код остался не изменным, за исключением того что было предложено:
if      (X<5)         {tft.print("0");}
else if (X<10)        {tft.print(float(int(X*100))/100,2);}
else if (X<100)        {tft.print(float(int(X*100))/100,1);}
else                                               {tft.print("---");}
в таком варианте замена 100 на 10 на количество знаков после запятой не влияло, менял 2 и 1.

запечатал так, лишний 0 не появляется
if      (X<5)         {tft.print("0");}
else if (X<10)        {tft.print(X,2);tft.setCursor(80,positionY+17-10); tft.print(" ");} // запечатал ячейку пробелом где лишний 0 появлялся
else if (X<100)        {tft.print(X,1);}
else                                               {tft.print("---");}

или я не понял и от функции сравнения нужно вообще отказаться? тогда как определить чему равно число и какое количество знаков выводить?

Kaka
2019-12-15 18:33:31

Не понял, то отбрасывание, что я тебе написал не решило проблему?
Так не бывает, ты что-то не так сделал. Показывай.

arik гость
2019-12-15 18:15:52

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


прав всё таки г0сть, с его замечательным хрустальным шаром smile, запечатывание лишнего 0 пока единственное решение, учитывая вышеизложенное.

всем спасибо!!! smile пойду искать функции подготовки формата данных до вывода на печать.

Kaka
2019-12-15 16:09:59
arik гость пише:

Serial.println(1.23456, 0) выводит "1" Serial.println(1.23456, 2) выводит "1.23" Serial.println(1.23456, 4) выводит "1.2346" - это не я придумал

Ну, всё правильно, выводит с округлением. Serial.println(1.65432, 0) выводит "2". Не знаю, как ты мог этого не понять.

И это, не надо оправдываться и доказывать, что ты прав. доказывай компьютеру, мне-то зачем?

arik гость
2019-12-15 15:52:32

да, используется Adafruit_GFX и метод затирания пробовал, не подходит, выводится много данных, код получается очень громоздким...
<stdio.h> почитаю, спасибо.
"print(X,2) означает "округлить до 2 знаков и напечатать"." ну если бы в функции принт было бы написано что округляется, даже не брался бы за такой оператор! а написано то дословно - Serial.print(val) Serial.print(val, format) - Serial.println(1.23456, 0) выводит "1" Serial.println(1.23456, 2) выводит "1.23" Serial.println(1.23456, 4) выводит "1.2346" - это не я придумал.
вот за "tft.print(float(int(X*100))/100,2);" спасибо! сейчас займусь, отпишусь.

Kaka
2019-12-15 15:28:35
arik гость пише:

я где то писал про округление данных?

Конечно, писал!

print(X,2) означает "округлить до 2 знаков и напечатать".

arik гость пише:

все данные идут в том виде, как они посчитаны, без округлений, они мне нужны в точном виде.

В точном виде данных типа float не бывает в природе. Они всегда округляются. На это ты и напоролся.

arik гость пише:

мне нужно при отображении на экране отсекать лишние знаки... может быть я вообще не правильно выбрал путь через оператор сравнения?

Ну, это само собой, что по уму это делается не так, но и так может работать, если написать правильно, ты просто не понимаешь как оно устроено, потому и пишешь чё попало. Сейчас-то понял в чём проблема? Осталось только её решить? Или так и не понял?

arik гость пише:

на сколько я понимаю, в коде который я использую это заложено
else if (X<10)          {tft.print("  ");tft.print(X,2); tft.print(" ");}
если число 9.999 печтаем два пробела потом само число с форматом 2 знаков после запятой и печатаем пробел

Похоже, ни хрена не понял. Если "если число 9.999", то "с форматом 2 знаков после запятой" оно будет 10,00. Именно это у тебя и печатается. Так и должно быть.

Если тебе надо просто отбрасывать лишние знаки, а не округлять, та отбрасывай их сам. Вместо "tft.print(X,2);" напиши "tft.print(float(int(X*100))/100,2);" это отбросит все знаки, кроме двух. Если надо отбросить все, кроме одного, то замени 100 на 10.

Підвал форуму