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
    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. – Filip Franik Jul 22 '19 at 17:00
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.

  • 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 Jul 23 '19 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 Jul 23 '19 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 (-:

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.