Преобразование данных в Processing

Тема в разделе "Флудилка", создана пользователем atompost, 13 сен 2013.

  1. atompost

    atompost Гик

    Господа может кто подскажет, как преобразовывать типы данных из одного в другой, я только начал разбираться с процессингом, чет пока еще не въехал.

    Смысл такой: читаю с ИК датчика данные с пульта, записываю их в переменную val, начинаю проверять условие дает ошибку.

    import processing.serial.*;

    Serial myPort;
    Float val;
    ...

    String portName = Serial.list()[1];
    myPort = new Serial(this, portName, 9600);
    ...

    if ( myPort.available() > 0) {
    val = myPort.read();
    }
    background(255);

    if (val == 2155815645) { - ругается на эту строку
    fill(0);
    }
     
  2. Unixon

    Unixon Оракул Модератор

    И что говорит?
     
  3. atompost

    atompost Гик

    cannot convert from int to Float
     
  4. Unixon

    Unixon Оракул Модератор

    Ну вот вам и ответ. Используйте явное приведение типов или соответствующий метод класса Float.
     
  5. atompost

    atompost Гик

    можно пример, не въезжаю... я же явно объявил переменную как float ...
     
  6. Корней

    Корней Гик

    2155815645.0f
     
  7. Корней

    Корней Гик

    Обратите внимание, что в Java у Float 24битная мантисcа (точнее даже 23битная), а 2155815645 - это больше, чем 2 в 31 степени.
     
  8. atompost

    atompost Гик

    бл***, извините за мат, сам туплю
     
  9. nailxx

    nailxx Официальный Нерд Администратор

    Корней дело говорит. А почему вы в Serial передаёте значение как Float, а не целое число?

    Float вообще нельзя использовать в качестве каких-то ID, т.к. их сравнение немного искусственно. Float нужно сравнивать на равенство, используя небольшой, допустимый диапазон отклонений. Вроде:

    Код (C):
    if (abs(actualValue - expectedValue) < someSmallValue)
    {
        blaBlaBla();
    }
     
  10. NR55RU

    NR55RU Гик

    Кстати если сильно хочется работать с Float и известна требуемая точность то есть один прием который часто применяют когда известна требуемая точность это привидение к целому числу, а именно.
    Мы работаем с Float и нам надо 2 знака после запятой, в итоге делают так
    100.55321 * 100 = 10055.321 далее просто отбрасываем дробную часть и преобразуем в целое число - 10055.
    Его можно легко и ТОЧНО сравнивать с другими "дробными" числами и как следствие передавать куда-то вполне безопасно.
    А когда требуется снова получить Float просто 10055 / 100 = 100.55

    По сути если речь идет о каких то физических данных, это как изменить величину измерения, например если работаем с рублями то переводим все в целые копейки чем имеем 1 рубль и 32 копейки. Если с расстоянием то переводим до той точности которая янам нужна до метров или сантиметров или миллиметров, главное получить целое число, в итоге все становится проще легче и менее подвержено ошибкам.

    Вообще сколько я не читал про работу с числами с плавающей точкой, почти всегда приводят подобные примеры как средство решения этой проблему. По крайней мере для решения больше части стандартных задач.
     
  11. Unixon

    Unixon Оракул Модератор

    А зачем оно вообще Float ?
     
  12. Корней

    Корней Гик

    http://en.wikipedia.org/wiki/Fixed-point_arithmetic ;)
     
  13. atompost

    atompost Гик

    Пошел по другому пути:

    Код (C):
    import processing.serial.*;
    int lf = 10;   
    String myString = null;
    String red_led = "2155815645";
    Serial myPort;  
    void setup() {
      size(200, 200);
      println(Serial.list());
      myPort = new Serial(this, Serial.list()[1], 9600);
      myPort.clear();
      myString = myPort.readStringUntil(lf);
      myString = null;
    }

    void draw() {
      while (myPort.available () > 0) {
        myString = myPort.readStringUntil(lf);

        if (myString != null) {
          myString = trim(myString);
          println (myString);
          if (myString == red_led) {
            println("yes");
            background(255);   
            fill(255, 0, 0);
          }  
          rect(50, 50, 100, 100);
        }
      }
    }
     
    Вот это условие все равно не срабатывает, хз почему ...

    Код (C):
     if (myString == "2155815645") {
            println("yes");
            background(255);   
            fill(255, 0, 0);
          }  
     
  14. Корней

    Корней Гик

    myString.equals()
     
    Unixon и atompost нравится это.
  15. NR55RU

    NR55RU Гик

    myString == red_led

    Подобное условие если я не ошибаюсь сравнивает не значения строки а то что обе переменные указывают на один и тот же объект. А для сравнения строк как уже написал Корней требуется соответствующая функция которая произведет посимвольное сравнение двух строк.

    P.s. Исключительно качестве рекомендации, если вы и дальше планируете что-то программировать с ардуином, то лучше все же изучать тот же Си хотя бы в базе, все станет чуть понятнее.
    Могу порекомендовать отличную книгу для новичка Изучаем программирование на С
     
  16. atompost

    atompost Гик

    Спасибо за рекомендации все получилось !!!