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!

H3xx1st
  • 11
  • 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 friendly`enum`. – Filip Franik Jul 22 '19 at 17:00

2 Answers2

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.

Majenko
  • 103,876
  • 5
  • 75
  • 133
  • 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 00: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 00: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 (-:

Jim Mack
  • 231
  • 5
  • 13