I have the following code (I realise String isn't very efficient, but this sketch doesn't have to be)
debugOutput gets called every loop, but I only want to spam the serial bus (to debug) if the status changes.
However, it runs once, despite changes to the pins being made.
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;
}
}
My suspicion is it was because of the pointers being the same, but I declare a new string every time this function runs. Just in case, I tried to swap this to strcpy, which isn't valid since I'm using String instead of character arrays.
What can I do, I'm really confused.
This is the Serial output, btw
State Change: 1
So it's clear to me that my string appending isn't even working as expected.
2 Answers 2
There is this thing called "operator precedence" that defines the hierarchy of operators.
The ?:
will be calculated after the +
. That's why
s = s + digitalRead(2) ? "1" : "0";
actually means
s = (s + digitalRead(2)) ? "1" : "0";
But you want
s = s + (digitalRead(2) ? "1" : "0");
-
To make this a more useful answer, you should really mention how the types are ignored / coerced. I've awarded you the answer regardless though. I was aware of operator precedence, but not how it interacted with the types under C.Ryan Leach– Ryan Leach2020年08月27日 19:40:00 +00:00Commented Aug 27, 2020 at 19:40
I'm not sure why string appending using + was failing, but changing it from
s = s + digitalRead(2) ? "1" : "0";
to
s += digitalRead(2) ? "1" : "0";
fixed my issue.
-
I won't be accepting this as the answer, even though that it is AN answer, in order to award the answer points to someone that explains what was wrong.Ryan Leach– Ryan Leach2020年08月27日 13:50:49 +00:00Commented Aug 27, 2020 at 13:50
-
first of all you shouldn't use String for this. you can store numbers, compare numbers, print numbers. digitalRead returns a number2020年08月27日 14:22:49 +00:00Commented Aug 27, 2020 at 14:22
prevState = s;
And check for inequality is simplyprevState != s
.