Как скопировать и сравнить строку?

У меня есть следующий код (я понимаю, что String не очень эффективен, но этот скетч не должен быть таким)

debugOutput вызывается в каждом цикле, но я хочу спамить последовательную шину (для отладки) только при изменении статуса.

Однако он запускается один раз, несмотря на вносимые изменения в выходе.

String prevState = "";
void debugOutput() {
  String s = "";
  //s = s + digitalRead(6) ? "1" : "0";
  //s = s + digitalRead(5) ? "1" : "0";
  s = s + digitalRead(4) ? "1" : "0";
  s = s + digitalRead(3) ? "1" : "0";
  s = s + digitalRead(2) ? "1" : "0";
  if(!prevState.equals(s)) {
    Serial.println("State Change: "+s);
    //strcpy(s, prevState);
    prevState = s;
  }
}

Я подозреваю, что это было из-за того, что указатели были одинаковыми, но я объявляю новую строку каждый раз, когда эта функция запускается. На всякий случай я попытался заменить это на strcpy, что недопустимо, поскольку я использую String вместо массивов символов.

Что мне делать, я совсем запутался.

Это последовательный вывод, кстати

Изменение состояния: 1 Итак, мне ясно, что добавление строк даже не работает должным образом.

, 👍0

Обсуждение

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

Зачем использовать строку? В любом случае, сделать копию si так же просто, как prevState = s;, а проверить на неравенство просто prevState != s., @KIIV

Это должно было быть быстрым и грязным кодом отладки, которого не будет в финальной версии. Я пытался сделать то, что мне казалось легким и быстрым для меня в то время, но когда вам нужно начать отлаживать свой код отладки, вы начать расстраиваться., @Ryan The Leach

Я добавил редактирование, так как понял, что пропустил, включая то, что было в моем последовательном выводе., @Ryan The Leach

Да, приоритет оператора нужно знать (или вы должны использовать круглые скобки). Даже оператор += позволит вам избежать таких вещей, как добавление результата digital с помощью s, а затем использовать его как логическое значение для ?: :D, @KIIV

Приоритет оператора? Черт возьми, я предполагал, что типы, устраняющие неоднозначность (из Java, C #), предотвратят это, теперь я чувствую себя действительно глупо., @Ryan The Leach

Класс string может обрабатывать String+int, и, очевидно, его также можно неявно привести к логическому значению (что в данном случае действительно удивительно и довольно опасно)., @KIIV


2 ответа


Лучший ответ:

3

Есть такая штука, как "приоритет оператора" который определяет иерархию операторов.

?: будет вычисляться после +. Вот почему

s = s + digitalRead(2) ? "1" : "0";

на самом деле означает

s = (s + digitalRead(2)) ? "1" : "0";

Но вы хотите

s = s + (digitalRead(2) ? "1" : "0");
,

Чтобы сделать этот ответ более полезным, вы должны действительно упомянуть, как типы игнорируются/принуждаются. Тем не менее, я наградил вас ответом. Я знал о приоритете оператора, но не знал о том, как он взаимодействует с типами в C., @Ryan The Leach


0

Я не уверен, почему добавление строки с помощью + не удалось, но я изменил его с

s = s + digitalRead(2) ? "1" : "0";

в

s += digitalRead(2) ? "1" : "0";

исправил мою проблему.

,

Я не буду принимать это как ответ, даже несмотря на то, что это ответ AN, чтобы присудить баллы за ответ тому, кто объяснит, что было не так., @Ryan The Leach

прежде всего, вы не должны использовать String для этого. Вы можете хранить числа, сравнивать числа, печатать числа. digitalRead возвращает число, @Juraj