Basically I'm trying to output a string based upon a value in an array, the following code is what I have come up with to achieve my desired result, but I have a feeling that there is a better way to do it.
String day(int day) {
if (day == 1) return "Sunday";
if (day == 2) return "Monday";
if (day == 3) return "Tuesday";
if (day == 4) return "Wednesday";
if (day == 5) return "Thursday";
if (day == 6) return "Friday";
if (day == 7) return "Saturday";
else return "Undefined";
}
void setup() {
Serial.begin(57600);
while (!Serial);
Serial.println(day(1));
}
void loop() {
;
}
This prints "Sunday" in the Serial monitor
I would appreciate any input on how to optimize this code, thank you!
2 Answers 2
My method makes use of the __FlashStringHelper
class:
// For convenience:
typedef const __FlashStringHelper *FlashString;
FlashString reverseEnum(int val) {
switch (val) {
case 0: return F("Option zero");
case 1: return F("Option one");
case 2: return F("Option two");
default: return F("Invalid Enum");
}
}
Printing now is as simple as:
Serial.println(reverseEnum(2));
Because it's a "flash string" the print
function is overloaded properly and it performs the proper PROGMEM reading.
You can, of course, assign to a FlashString
:
FlashString myString = reverseEnum(2);
Serial.println(myString);
Or if you don't want to use a typedef you can use the raw type:
const __FlashStringHelper *myString = reverseEnum(2);
Serial.println(myString);
It's just much cleaner to use a typedef.
-
Thanks for the info, I was really hoping for a way to use the enum, forwards and backwards without having to code out the reverse.H3xx1st– H3xx1st2019年07月23日 00:35:37 +00:00Commented Jul 23, 2019 at 0:35
-
You could possibly craft something really horrible and complex with many layers of preprocessor macros, but it would be nasty and hard to understand. So don't. ;)Majenko– Majenko2019年07月23日 00:37:52 +00:00Commented Jul 23, 2019 at 0:37
I'm no expert, but I imagine something along these lines would work:
char* day(int day) {
static char* dayName[7] = {"Sunday", "Monday", .... };
if (day > 0 && day < 8) {
return dayName[day-1];
}
else
return "Undefined";
}
}
In any case, I'll be interested to hear why it's wrong (-:
-
Yeah, an array of char* C strings seems better than a long switch statement. (Voted)Duncan C– Duncan C2019年07月24日 02:11:01 +00:00Commented Jul 24, 2019 at 2:11
-
1Pointers to string literals should be
const char*
rather thanchar *
.Edgar Bonet– Edgar Bonet2019年07月24日 07:21:53 +00:00Commented Jul 24, 2019 at 7:21 -
@EdgarBonet - Curious - what's the advantage of const here? Is it style, speed, storage...?Jim Mack– Jim Mack2019年07月24日 17:37:33 +00:00Commented Jul 24, 2019 at 17:37
-
Correctness. In C++, you are not allowed to modify the contents of a string literal.Edgar Bonet– Edgar Bonet2019年07月24日 18:49:36 +00:00Commented Jul 24, 2019 at 18:49
Explore related questions
See similar questions with these tags.
int
number with a refactor friendlyenum
.