2013-09-21 7 views
0

Вопрос: Я новичок в C++, и после написания следующего кода кажется, что должен быть способ сократить его. Может быть, каким-то образом совпадающим с строкой? Как это будет сделано?Упрощение функции на основе соответствия шаблону строки

Функция принимает строку message, полученную через последовательный порт, и устанавливает значение определенного элемента массива pinValues[] в зависимости от message. Значение, которое будет установлено, определяется последним символом H или L непосредственно перед \n.

Строка картина: (a number)(H or L)\n

Например: message == "4H\n" будет установлен 5-й элемент pinValues[4] в HIGH. Номер в начале строки может быть От 1 до 2 цифр.

void setPinValues(String message) { 
    if(message == "1H\n") { 
      pinValues[1] = HIGH; 
     } 
     if(message == "1L\n") { 
      pinValues[1] = LOW; 
     } 
     if(message == "2H\n") { 
      pinValues[2] = HIGH; 
     } 
     if(message == "2L\n") { 
      pinValues[2] = LOW; 
     } 
     if(message == "3H\n") { 
      pinValues[3] = HIGH; 
     } 
     if(message == "3L\n") { 
      pinValues[3] = LOW; 
     } 
     if(message == "4H\n") { 
      pinValues[4] = HIGH; 
     } 
     if(message == "4L\n") { 
      pinValues[4] = LOW; 
     } 
     if(message == "5H\n") { 
      pinValues[5] = HIGH; 
     } 
     if(message == "5L\n") { 
      pinValues[5] = LOW; 
     } 
     if(message == "6H\n") { 
      pinValues[6] = HIGH; 
     } 
     if(message == "6L\n") { 
      pinValues[6] = LOW; 
     } 
} 
+0

Вы должны использовать зЬй :: Карта – Borgleader

ответ

0

Я проведу проверку правильности строки, извлекая ключ и значение из первых двух символов. Если вам не нужно здравомыслие проверить сообщение, оно может быть как

void setPinValues(String message) { 
    pinValues[ message[0] - '0' ] = (message[1] == 'H') ? HIGH:LOW; 
} 

Хотя вы можете сделать это немного больше, т.е. проверить длину строки, и что 2 обугливает вашей проверки являются в правом диапазоне. т.е.

void setPinValues(string message) { 

    if ( 
     message.size() >= 2 
     and 
     message[0] >= '1' and message[0] <= '6' 
     and (message[1]=='H' or message[1]=='L') 
     ) { 
    pinValues[ message[0] - '0' ] = (message[1] == 'H') ? HIGH:LOW; 
    } 
} 

EDIT: Вы могли бы также расширить, что проверка двух первых цифр, то есть

int n, off=0; 


if (s[off] <= '9' and s[off] >= '0') 
{ 
    n = s[off++] - '0'; 
} 
if (s[off] <= '9' and s[off] >= '0') 
{ 
    n = 10*n + s[off++] - '0'; 
} 
if (off > 0 and (s[1]=='H' or s[1]=='L')) { 
    pinValues[ message[0] - '0' ] = (message[1] == 'H') ? HIGH:LOW; 
} 
+0

же ошибка, как я сделал:. Вы упускать из виду * Номер в начале строки может быть от 1 до 2 цифр * – syam

+0

О, я не видел, что с ним не было в коде. Однако это не должно усложнять ситуацию. –

0

Предполагая String фактически std::string или имеет одинаковый интерфейс, а также предполагая набор символов ASCII-совместимый ...

void setPinValues(String message) { 
    const size_t sz = message.size(); 

    // input validation, ignore the message if it doesn't fit the pattern 
    // you can remove this "if" block if the message has already been validated 
    if ( (sz < 3) || (sz > 4) 
      // note how message[0] will be checked twice if sz == 3 
      // once as message[0] and once as message[sz -3] 
      // but if sz == 4 we check message[0] and message[1] 
     || (message[0] < '0') || (message[0] > '9') 
     || (message[sz - 3] < '0') || (message[sz - 3] > '9') 
     || ((message[sz - 2] != 'H') && (message[sz - 2] != 'L')) 
     || (message[sz - 1] != '\n')) 
     return; 

    // convert the first or two characters to a number 
    int pinNumber = message[0] - '0'; 
    if (sz == 4) 
     pinNumber = (pinNumber * 10) + (message[1] - '0'); 

    // additional check to verify the pin number is in the correct range 
    if ((pinNumber < 1) || (pinNumber > 6)) 
     return; 

    // apply 
    pinValues[pinNumber] = (message[sz - 2] == 'H' ? HIGH : LOW); 
} 
0

Это, вероятно, не является официальным «C++» - одобрил способ сделать это, но вы можете сделать:

unsigned int pinNo = 0; 
unsigned char level = 0; 
int result = sscanf(message.c_str(), "%u%c", &pinNo, &level); 
if (result < 2) 
    // it failed 
if (pinNo > 6) 
    // bad data 
levelVal = (level == 'H') ? HIGH : LOW; 
Смежные вопросы