itehno
21.Март.2023 12:35:13
1
Добрый день.
Подскажите, пожалуйста, каким образом вывести строку в циклах (AVR), если строка в двумерном массиве?
С выводом одномерного все понятно:
for (int i = 0; i < 3; i++) {
Serial.println(FPSTR(pgm_read_word(str_list + i)));
}
Как быть с многомерным?
b707
21.Март.2023 12:40:14
2
Покажите код целиком, пожалуйста
ЗЫ Вы не в первый раз употребляете обозначение “циклы (АВР)”. А вы думаете циклы на АВР чем-то отличаются от таковых, например, на СТМ? :))))
itehno
21.Март.2023 12:41:53
3
Код разбит на файлы и очень много зависимостей. Нет такой возможности. Проще новый написать под этот пример.
Serial.println(FPSTR(pgm_read_word(str_list + i + j * (ЧИСЛО ЭЛЕМЕНОТОВ))));
1 лайк
b707
21.Март.2023 12:42:49
5
проще так проще, решать вам.
Но в любом случае, куска из первого сообщения недостаточно для ответа.
b707
21.Март.2023 12:44:10
6
Командир, брось, не донесешь
Ты уверен, что у него двумерный массив, а не массив массивов, например?
b707:
массив массивов
Для строк во flash ??? - это же пи…ец
b707
21.Март.2023 12:47:19
8
Официальный пример использования ПРОГМЕМ для строк именно так и написан - сначала отдельные строки в пргмеме, а потом ссылки на них в другом массиве тоже в прогмеме.
Это понятно он для него привел правильный пример - я так понимаю что второй массив у ТС двухмерный … для этого случая и писал
itehno
21.Март.2023 12:50:24
10
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 ]) ???
itehno
21.Март.2023 12:56:46
12
Потому что пример был взят с соседнего форума в теме про PROGMEM
А почитать про массивы не судьба ?
str_list + i и &str_list[ i ] это эквивалентно
itehno
21.Март.2023 12:58:58
14
Я полагаю, что запись должна быть такого вида:
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 лайк
itehno
21.Март.2023 13:03:19
16
На 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 ]
itehno
21.Март.2023 13:07:30
20
Спасибо, буду пробовать. Эти сообщения не так просто вызвать. Нужно “дергать” оборудование.
b707
21.Март.2023 13:23:44
21
это справедливо для любого массива С, не только на АВР и в прогмем