Как скопировать и сравнить строку?
У меня есть следующий код (я понимаю, что 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
Итак, мне ясно, что добавление строк даже не работает должным образом.
@Ryan The Leach, 👍0
Обсуждение2 ответа
Лучший ответ:
Есть такая штука, как "приоритет оператора" который определяет иерархию операторов.
?:
будет вычисляться после +
. Вот почему
s = s + digitalRead(2) ? "1" : "0";
на самом деле означает
s = (s + digitalRead(2)) ? "1" : "0";
Но вы хотите
s = s + (digitalRead(2) ? "1" : "0");
Чтобы сделать этот ответ более полезным, вы должны действительно упомянуть, как типы игнорируются/принуждаются. Тем не менее, я наградил вас ответом. Я знал о приоритете оператора, но не знал о том, как он взаимодействует с типами в C., @Ryan The Leach
Я не уверен, почему добавление строки с помощью + не удалось, но я изменил его с
s = s + digitalRead(2) ? "1" : "0";
в
s += digitalRead(2) ? "1" : "0";
исправил мою проблему.
Я не буду принимать это как ответ, даже несмотря на то, что это ответ AN, чтобы присудить баллы за ответ тому, кто объяснит, что было не так., @Ryan The Leach
прежде всего, вы не должны использовать String для этого. Вы можете хранить числа, сравнивать числа, печатать числа. digitalRead возвращает число, @Juraj
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- форматирование строк в Arduino для вывода
- Очень простая операция Arduino Uno Serial.readString()
- Arduino Преобразование std:string в String
- Как прочитать входящие ШЕСТНАДЦАТИРИЧНОЕ значение из serial метод read ()?
- Arduino Serial.ReadString() проблема
- Очистка строкового буфера с помощью memset после последовательного чтения
Почему вы используете 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