2014-12-29 3 views
0

Идея заключалась в том, чтобы создать код для сравнения имени, читаемого с serial.read, с предварительно обозначенным именем.запрос для пользователя 'compareTo' в charArrayBuffer, который относится к классу non-class 'char [9]'

Оба объявления - массивы символов, длина [9], и поэтому я не понимаю, почему возникает проблема.

Код:

char name1[9] = "Jesper"; 

char nameBuffer[9]; 

void setup() 
{ 

     Serial.begin(9600); 

} 

void loop() 
{ 

     int i = 0; 

     nameBuffer[0] = 0; 

     while(Serial.available() == 0) 
     { 
      // wait for data to be send 
     } 

     while(Serial.available() > 0) 
     { 
      int inByte = Serial.read(); 
      delay(50); 
      nameBuffer[i] = char(inByte); 
      i++; 
     } 

     Serial.print("Searching for: "); 
     Serial.println(nameBuffer); 

    if (nameBuffer.compareTo(name1) < 0) 
    { 
     Serial.println("Did you mean to write: \"Jesper\""); 
    } 
    else 
    { 
     Serial.println("Jesper found"); 
    } 
    } 

Ошибка получил:

ошибка: запрос члена 'CompareTo' в 'nameBuffer', который имеет тип неклассовую 'символ [9]

ответ

0

Заменить

if (nameBuffer.compareTo(name1) < 0) 

с

if (strcmp(nameBuffer, name1) != 0) 

nameBuffer не может быть доступен с помощью оператора ..

BTW, в соответствии с сообщением об ошибке, вы программируете на C++, а не в С.

+0

К сожалению об этом, я бы нашел строку сравнения руководство, включенную C++, но я учусь печатать на языке Си. Итак. оператор - инструмент в C++? Ваш ответ работал идеально слишком, спасибо – Ivan

0

Попробуйте

strncmp(nameBuffer, name1, sizeof nameBuffer) < 0 

вместо

nameBuffer.compareTo(name1) < 0 

ваших переменных char Массивы являются а не class, поэтому у них нет методов.

Я использую strncmp, потому что я не могу быть уверен, что nameBuffer и name1 должным образом нуля, поэтому этот способ предотвратить некоторые проблемы, если они не были

Поскольку вы используете C++, вы можете также попробовать использовать std::string вместо , так как таким образом, вам не нужно беспокоиться о длине строки, если вы объявляете

std::string nameBuffer; 
std::string name1("Jasper"); 

затем добавьте char s вы можете просто

nameBuferr += static_cast<char>(inByte); 

и сделать сравнение только

if (nameBuffer < name1) 
+0

если (зЬгстр (nameBuffer, name1) <0) работал отлично веселит – Ivan

+0

Если я добавить аргумент SizeOf nameBuffer так, что: strncmp (nameBuffer, name1, SizeOf nameBuffer) <0 Я получаю следующую ошибку: слишком много аргументов для функции int strcmp (const char *, const char *) – Ivan

+0

'strcmp' принимает только две строки' '\ 0'', поэтому ваш синтаксис неверен, см.' N' после ' str' это 'strncmp' <-' str {n} cmp'. –