Господа может кто подскажет, как преобразовывать типы данных из одного в другой, я только начал разбираться с процессингом, чет пока еще не въехал. Смысл такой: читаю с ИК датчика данные с пульта, записываю их в переменную 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); }
Обратите внимание, что в Java у Float 24битная мантисcа (точнее даже 23битная), а 2155815645 - это больше, чем 2 в 31 степени.
Корней дело говорит. А почему вы в Serial передаёте значение как Float, а не целое число? Float вообще нельзя использовать в качестве каких-то ID, т.к. их сравнение немного искусственно. Float нужно сравнивать на равенство, используя небольшой, допустимый диапазон отклонений. Вроде: Код (C): if (abs(actualValue - expectedValue) < someSmallValue) { blaBlaBla(); }
Кстати если сильно хочется работать с Float и известна требуемая точность то есть один прием который часто применяют когда известна требуемая точность это привидение к целому числу, а именно. Мы работаем с Float и нам надо 2 знака после запятой, в итоге делают так 100.55321 * 100 = 10055.321 далее просто отбрасываем дробную часть и преобразуем в целое число - 10055. Его можно легко и ТОЧНО сравнивать с другими "дробными" числами и как следствие передавать куда-то вполне безопасно. А когда требуется снова получить Float просто 10055 / 100 = 100.55 По сути если речь идет о каких то физических данных, это как изменить величину измерения, например если работаем с рублями то переводим все в целые копейки чем имеем 1 рубль и 32 копейки. Если с расстоянием то переводим до той точности которая янам нужна до метров или сантиметров или миллиметров, главное получить целое число, в итоге все становится проще легче и менее подвержено ошибкам. Вообще сколько я не читал про работу с числами с плавающей точкой, почти всегда приводят подобные примеры как средство решения этой проблему. По крайней мере для решения больше части стандартных задач.
Пошел по другому пути: Код (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); }
myString == red_led Подобное условие если я не ошибаюсь сравнивает не значения строки а то что обе переменные указывают на один и тот же объект. А для сравнения строк как уже написал Корней требуется соответствующая функция которая произведет посимвольное сравнение двух строк. P.s. Исключительно качестве рекомендации, если вы и дальше планируете что-то программировать с ардуином, то лучше все же изучать тот же Си хотя бы в базе, все станет чуть понятнее. Могу порекомендовать отличную книгу для новичка Изучаем программирование на С