Оперативная память ценный ресурс, а Flash память программ не часто используется на 100%. Строковые литералы засоряют оперативную память даже если они используются для объявления переменных и констант локально.
Строковые литералы можно хранить в Flash памяти. На плате Arduino UNO, NANO и им подобных установлен микроконтроллер ATmega328 / P. М-к ATmega328 содержит 32 Кбайт Flash-памяти программ, 1 Кбайт энергонезависимой памяти (EEPROM), 2 Кбайт оперативной памяти (SRAM).
Пример, сохраняем строку в Flash памяти микроконтроллера, а восстанавливаем отдельные слова по индексу, как из строкового массива:
PROGMEM const char words[] = "DROP DUP SWAP OVER ROT ROT AND OR NOT XOR 1+ 1- - + * NEGATE ABS / MOD /MOD";
String input_word(int n) {
char buf[16] = "Not Found";
int i = 0; // Счётчик букв в PROGMEM const
int j = 0; // Счётчик пробелов
int k = 0; // Счётчик букв в buf
char a = 'x';
while (a != 0) {
a = pgm_read_byte_near(words + i);
if (j == n) {
buf[k] = a;
k++;
}
if (a == ' ') {
j++;
}
if (j > n) {
buf[k] = 0;
break;
}
i++;
}
return buf;
}
void setup() {
Serial.begin(9600);
while (!Serial); // wait for serial port to connect
Serial.println("OK");
for (int n = 0; n < 40; n++) {
Serial.print(n);
Serial.print(' ');
Serial.println(input_word(n));
}
}
void loop() {
}
hcch