Циклы (AVR) в двумерном массиве

Добрый день.
Подскажите, пожалуйста, каким образом вывести строку в циклах (AVR), если строка в двумерном массиве?

С выводом одномерного все понятно:

for (int i = 0; i < 3; i++) {
  Serial.println(FPSTR(pgm_read_word(str_list + i)));
}

Как быть с многомерным?

Покажите код целиком, пожалуйста

ЗЫ Вы не в первый раз употребляете обозначение “циклы (АВР)”. А вы думаете циклы на АВР чем-то отличаются от таковых, например, на СТМ? :))))

Код разбит на файлы и очень много зависимостей. Нет такой возможности. Проще новый написать под этот пример.

Serial.println(FPSTR(pgm_read_word(str_list + i + j * (ЧИСЛО ЭЛЕМЕНОТОВ))));

1 лайк

проще так проще, решать вам.
Но в любом случае, куска из первого сообщения недостаточно для ответа.

Командир, брось, не донесешь :slight_smile:
Ты уверен, что у него двумерный массив, а не массив массивов, например?

Для строк во flash ??? - это же пи…ец

Официальный пример использования ПРОГМЕМ для строк именно так и написан - сначала отдельные строки в пргмеме, а потом ссылки на них в другом массиве тоже в прогмеме.

Это понятно он для него привел правильный пример - я так понимаю что второй массив у ТС двухмерный … для этого случая и писал

const char Err_11_1[] PROGMEM = "Текст";
const char Err_11_2[] PROGMEM = "Текст";
const char Err_11_3[] PROGMEM = "Текст";
const char Err_11_4[] PROGMEM = "Текст";
const char Err_11_5[] PROGMEM = "Текст";
const char Err_11_6[] PROGMEM = "Текст";
const char Err_11_7[] PROGMEM = "Текст";
const char Err_11_8[] PROGMEM = "Текст";

const char Err_12_1[] PROGMEM = "Текст";
const char Err_12_2[] PROGMEM = "Текст";
const char Err_12_3[] PROGMEM = "Текст";
const char Err_12_4[] PROGMEM = "Текст";
const char Err_12_5[] PROGMEM = "Текст";
const char Err_12_6[] PROGMEM = "Текст";
const char Err_12_7[] PROGMEM = "Текст";
const char Err_12_8[] PROGMEM = "Текст";


const char* const Err_11_12[2][8] PROGMEM = { { Err_11_1, Err_11_2, Err_11_3, Err_11_4, Err_11_5, Err_11_6, Err_11_7, Err_11_8 },
                                              { Err_12_1, Err_12_2, Err_12_3, Err_12_4, Err_12_5, Err_12_6, Err_12_7, Err_12_8 }};

для этого случая j*8
почему вы не пишете (&str_list[i]) и …(&Err_11_12[ i ][ j ]) ???

Потому что пример был взят с соседнего форума в теме про PROGMEM

А почитать про массивы не судьба ?
str_list + i и &str_list[ i ] это эквивалентно

Я полагаю, что запись должна быть такого вида:

String Message_11_12 = FPSTR(pgm_read_word(Err_11_12 + _Array + _NumberOfArray * (8)));
String Message_11_12 = FPSTR(pgm_read_word(&Err_11_12  [ i ] [ j ]));
1 лайк

На AVR компилятор не сможет оптимизировать процесс чтения, потому что он не знает значения переменной-счётчика в конкретной строке кода. Необходимо преобразовать данные к размеру, который занимает указатель в памяти – это pgm_read_word. В функцию нужно передать “адрес” переменной, а массив по сути является указателем сам на себя, то есть просто pgm_read_word(str_list). Это адрес первого (нулевого) элемента. Соответственно для получения доступа к следующему элементу нужно увеличить адрес на 1 и получится
pgm_read_word(str_list + i)

Не умничайте - проверьте !!!

Нет.
Эквивалентно
*(str_list + i) и str_list[ i ]
или
str_list + i и &str_list[ i ]

Спасибо, буду пробовать. Эти сообщения не так просто вызвать. Нужно “дергать” оборудование.

это справедливо для любого массива С, не только на АВР и в прогмем