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!

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.

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

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.