ARDUINO Чтение из структуры

Linexer

✩✩✩✩✩✩✩
20 Сен 2021
11
0
Оформи код соответствующим тэгом
Прошу помощи в чтении из структуры. Знаний в программировании немного, пока это то, что более менее работает

C++:
#include <avr/pgmspace.h>

struct morseLettersTable {const char* morseLetter;const char* translatedLetter;};
const morseLettersTable PROGMEM morseLettersArray[] =
{
{ ".-", 'A' }, { "-...", 'B' }, { "-.-.", 'C' },
{ "-..", 'D' }, { ".", 'E' }, { "..-.", 'F' },
{ "--.", 'G' }, { "....", 'H' }, { "..", 'I' },
{ ".---", 'J' }, { "-.-", 'K' }, { ".-..", 'L' },
{ "--", 'M' }, { "-.", 'N' }, { "---", 'O' },
{ ".--.", 'P' }, { "--.-", 'Q' }, { ".-.", 'R' },
{ "...", 'S' }, { "-", "T" }, { "..-", 'U' },
{ "...-", 'V' }, { ".--", 'W' }, { "-..-", 'X' },
{ "-.--", 'Y' }, { "--..", 'Z' },
};

void setup()
{
Serial.println(morseLettersArray[1].morseLetter); //Работает, выводит -... При вводе любого числа выводит правильную строку
for(int i=0; i<26; i++)
{
Serial.println(morseLettersArray[i].morseLetter)); //Не работает. Как бы я ни пытался, ни с &, ни с pgm_read_byte. Выводит либо цифры, либо ?
}

void loop() {}
Суть в том, что будет сравнение введенного сообщения со всеми буквами. Но если не работает просто вывод циклом, то и сравнение работать не будет.
Подскажите, пожалуйста, как нужно сделать чтение из структуры
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
2,859
850
Вы когда один элемент выводите - вы к нему по индексу обращаетесь. А в цикле я у вас никаких индексов не вижу.
Кроме того, у вас структура в прогмем неверно положена - при таком описании у вас во флеш попадут только ссылки на строки, а сами строки будут занимать оперативку.
 

Linexer

✩✩✩✩✩✩✩
20 Сен 2021
11
0
@bort707, Изменил, но пост не обновился. Подскажите, как правильно. Нагуглить просто не смог, как надо. Только такая комбинация не падает в ошибки, знаю что неправильно
 

bort707

★★★★★★✩
21 Сен 2020
2,859
850
@Linexer,что, разве так не работает?
C++:
Serial.println(morseLettersArray[i].morseLetter));
 

poty

★★★★★★✩
19 Фев 2020
2,956
886
Доступ к PROGMEM осуществляется только через специальные функции, поэтому, либо:
1. Уберите ключевое слово PROGMEM (массив переедет в обычную память и с ним будут работать обычные функции).
2. Используйте промежуточный буфер в обычной памяти, заполняя его с помощью функций доступа к PROGMEM, а потом производите над элементом действие.
Функции доступа к PROGMEM ищите, в частности, в уроках Алекса, там есть также ссылка на развернутое описание всего этого дела.

Чтобы не было лишних переписок: первая часть программы в setup, с константами, заменяется оптимизатором языка ещё на стадии компиляции нужными символами, поэтому там работает.
 

Linexer

✩✩✩✩✩✩✩
20 Сен 2021
11
0
@bort707,Нет, так тоже не работает

@poty, Буфер я тоже пробовал, он тоже не работает. Это не единственный массив, уже не хватает памяти
 

Сотнег

★★★★★★★
15 Янв 2020
4,104
1,434
@Linexer, по-моему, вы записали в PROGMEM массив указателей, а не символов, и уж тем более не строк.

Ваша структура состоит из указателей.
 
Изменено:

Linexer

✩✩✩✩✩✩✩
20 Сен 2021
11
0
@Сотнег, Согласен, но что бы я не пробовал - ничего не работает. Вообще не понимаю, как правильно записать именно в таком формате, гугл не помогает
 

poty

★★★★★★✩
19 Фев 2020
2,956
886
@Linexer, если Вы в буфер записывали так, как используйте сейчаc, то и не заработает! Смотрите урок, на который указал Вам @Сотнег.
 

Linexer

✩✩✩✩✩✩✩
20 Сен 2021
11
0
Чтож, пришлось всё перевести в обычные массивы. Всё работает как надо. Спасибо всем :)
 

bort707

★★★★★★✩
21 Сен 2020
2,859
850
Чтож, пришлось всё перевести в обычные массивы. Всё работает как надо. Спасибо всем
Задачка неочевидная, но что-то рано вы сдались.
Вот так попробуйте - проверил, работает:
C++:
#include <avr/pgmspace.h>

struct morseLettersTable {
  const char* morseLetter;
  const char* translatedLetter;
};
const morseLettersTable PROGMEM morseLettersArray[] =
{
  { ".-", 'A' }, { "-...", 'B' }, { "-.-.", 'C' },
  { "-..", 'D' }, { ".", 'E' }, { "..-.", 'F' },
  { "--.", 'G' }, { "....", 'H' }, { "..", 'I' },
  { ".---", 'J' }, { "-.-", 'K' }, { ".-..", 'L' },
  { "--", 'M' }, { "-.", 'N' }, { "---", 'O' },
  { ".--.", 'P' }, { "--.-", 'Q' }, { ".-.", 'R' },
  { "...", 'S' }, { "-", "T" }, { "..-", 'U' },
  { "...-", 'V' }, { ".--", 'W' }, { "-..-", 'X' },
  { "-.--", 'Y' }, { "--..", 'Z' },
};

void setup()
{
  Serial.begin(9600);
  for ( int i = 0; i < 6; i++ ) {
    const morseLettersTable &foo = morseLettersArray[i];
    Serial.println( (char*)pgm_read_word( &foo.morseLetter ) );
   }
}

void loop() {}