1

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!

asked Jul 22, 2019 at 15:53
1
  • 1
    Just one little thing to add to all the answers. Since this is "enumeration" I suggest substituting the magical int number with a refactor friendlyenum. Commented Jul 22, 2019 at 17:00

2 Answers 2

3

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.

answered Jul 22, 2019 at 17:31
2
  • 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. Commented 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. ;) Commented Jul 23, 2019 at 0:37
1

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 (-:

answered Jul 24, 2019 at 1:03
4
  • Yeah, an array of char* C strings seems better than a long switch statement. (Voted) Commented Jul 24, 2019 at 2:11
  • 1
    Pointers to string literals should be const char* rather than char *. Commented Jul 24, 2019 at 7:21
  • @EdgarBonet - Curious - what's the advantage of const here? Is it style, speed, storage...? Commented Jul 24, 2019 at 17:37
  • Correctness. In C++, you are not allowed to modify the contents of a string literal. Commented Jul 24, 2019 at 18:49

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.