Узнать длину массива.

k4m454k
k4m454k аватар
Offline
Зарегистрирован: 18.10.2013
data = port.readStringUntil('\n');
  data = data.substring(0 , data.length() - 1);
  println(data);
  String[] p = split(data,";");
  
  
  
  for (i=0;i< p.length()-1 ;i++){
    println(p[i]);
    if (p[i].substring(0,1)=="T:"){
      temp = p[i].substring(2,p[i].length());
    }
    if (p[i].substring(0,1)=="H:"){
      hum = p[i].substring(2,p[i].length());
    }
  }

 

Есть такой вот код. Смысл, принять с ардуинки строку, типа "T:883;H:43fe;N:64"... и так далее... затем порезать её на куски, делителем является ";". дальше всё просто, сравниваем ключ и вытаскиваем значение. 
Так вот, оно ругается на строку for (i=0;i< p.length()-1 ;i++){ , а именно на p.length()... типа нельзя изменить длину масива (cannot invoke length() on the array type string). но какого чёрта? как узнать, сколько элементов в динамическом массиве?

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если не ошибаюсь, нужно писать p.length, а не p.length()

 

toc
Offline
Зарегистрирован: 09.02.2013

для простых массивов есть NUMITEMS(массив).

видел тут: http://forum.arduino.cc/index.php?topic=187730.15

k4m454k
k4m454k аватар
Offline
Зарегистрирован: 18.10.2013

kisoft пишет:

Если не ошибаюсь, нужно писать p.length, а не p.length()

 

Сработало. Спасибо =)

k4m454k
k4m454k аватар
Offline
Зарегистрирован: 18.10.2013

  for (i=0;i< p.length-1 ;i++){
//    это я тестил =============
//    println(p[i].substring(0,2));
//    println("temp="+temp);
// ========================
//    Вот сам цикл, который отрабатывает отлично. 
//
    if (p[i].substring(0,1)=="T"){ // условие верно. но не исполяется. в p[i] находится "T:23.5C"
//      println("if ok"); - это не показывается никогда, иф не исполняется
      temp = p[i].substring(2,p[i].length()); // 
    }

    if (p[i].substring(0,1)=="H"){ // это тоже не работает
      hum = p[i].substring(2,p[i].length());
    }
  }

 

помогите, IF не исполняется.

maksim
Offline
Зарегистрирован: 12.02.2012

Если бы условие было верным, то обязательно бы выполнилось ,а значит оно неверно.

 for (int i = 0; i < p.length()-1; i++)
  {
    if (p.charAt(i) == 'T')
    {
      temp = p.substring(i+2);
      break; 
    }

    if (p.charAt(i) == 'H')
    {
      hum = p.substring(i+2);
      break; 
    }
  }

http://processing.org/reference/

http://processing.org/reference/String.html

k4m454k
k4m454k аватар
Offline
Зарегистрирован: 18.10.2013

maksim пишет:

Если бы условие было верным, то обязательно бы выполнилось ,а значит оно неверно.

 for (int i = 0; i < p.length()-1; i++)
  {
    if (p.charAt(i) == 'T')
    {
      temp = p.substring(i+2);
      break; 
    }

    if (p.charAt(i) == 'H')
    {
      hum = p.substring(i+2);
      break; 
    }
  }

http://processing.org/reference/

http://processing.org/reference/String.html

Вот и как верить этому миру, скажте мне... 

if (p[i].substring(0,1)=="T:") Не срабатывает.

if (p[i].charAt(0)=='T'){ Срабатывает. 

Как блин? Почему? Что за жесть? 

Строка "T:54.5C"
бука "T" точно латинская и там и там.... 

 

mixail844
Offline
Зарегистрирован: 30.04.2012

двойнми кавычками выделяеться тип string,а еденичными кавычками тип char.

k4m454k
k4m454k аватар
Offline
Зарегистрирован: 18.10.2013

mixail844 пишет:

двойнми кавычками выделяеться тип string,а еденичными кавычками тип char.

 

Это я знаю, но я там сравниваю, типа если огрызок строки, то есть 0 и 1 символ, равны "T:", то..... или тут так не сравнивается?

Почему первый ИФ, который я ранее писал, не срабатывает?

com
Offline
Зарегистрирован: 06.09.2013

строка и символ - разные типы данных. даже если у них одинаковое содержимое. теплое и мягкое.

ведь вы согласны с тем, что int val = 0 и char sym = '0' это две несравниваемые вещи, хотя в обоих переменных по сути ноль?

 

k4m454k
k4m454k аватар
Offline
Зарегистрирован: 18.10.2013

Так изначально у меня именно строка, и сравниваю со строкой. И облом. 

но как только я из строки выгрызу первый символ в виде Чар-а и сравню его с другим Чар-ом - всё ок. 

Не правильно это. 

Как же тогда строки сравнивать?

maksim
Offline
Зарегистрирован: 12.02.2012
ourlive
Offline
Зарегистрирован: 26.05.2012

сначала делаете так

println("!"+p[i].substring(0,1));

т.е. сначала печатаете, убеждаетесь в верном выделении подстроки и её результате, а заодно и правильном содержимом исходной строки. Когда приходится резать разные строки по разным условиям, никак иначе быстро отследить правильность не получается. И вообще, не брезгуйте применять печать промежуточных данных при отладке. Особенно оно касается чтения буфера кома/файлов и т.п.

k4m454k
k4m454k аватар
Offline
Зарегистрирован: 18.10.2013

ourlive пишет:

сначала делаете так

println("!"+p[i].substring(0,1));

т.е. сначала печатаете, убеждаетесь в верном выделении подстроки и её результате, а заодно и правильном содержимом исходной строки. Когда приходится резать разные строки по разным условиям, никак иначе быстро отследить правильность не получается. И вообще, не брезгуйте применять печать промежуточных данных при отладке. Особенно оно касается чтения буфера кома/файлов и т.п.

так проверял. Выводит точно нужный символ или строку. Но не сравнивает

ourlive
Offline
Зарегистрирован: 26.05.2012

раздел string, функция equival (или как то так), удачи

 

-----------

добрался до компа

Class    String
Name    equals()

Description Compares two strings to see if they are the same. This method is necessary because it's not possible to compare strings using the equality operator (==). Returns true if the strings are the same and false if they are not.
Syntax
str.equals(str)
Parameters
str String: any valid String

 

beervolk
Offline
Зарегистрирован: 21.11.2013

substring возвращает тип объекта String !!! Это недавно добавленный тип объекта.
а "T" - это массив символов !!! типа string !!!
потому и не бьет. Надо корректную функцию сравнения использовать. 
Правильно будет такое сревнение p[i].substring(0,1).compareTo(String("T"))
Читай возвращаемые значения метода http://arduino.ru/Reference/StringCompareTo

ourlive
Offline
Зарегистрирован: 26.05.2012

вы точно ардуино и процессинг не путаете?

beervolk
Offline
Зарегистрирован: 21.11.2013

сори :) темы попутал