Помогите пожалуйста разобраться с sprintf_P

sergz1

✩✩✩✩✩✩✩
5 Дек 2021
23
0
объявляю массив строк пологая, что во FLASH ( PROGMEM) (нет не так ?)

const String Dim[] PROGMEM ={" ","1","2","3"}; // полагаю что в FLASH

пытаюсь вывести форматную в строку в буфер в ОЗУ

char buf[10];

sprintf_P(buf, PSTR(%S"---"%S), Dim[1],Dim[2]);

полагаю, что строка управления тоже во Flash.

Почему компилятор (Arduino 1.8.9) ругается:
runningText:214:146: error: cannot pass objects of non-trivially-copyable type 'const class String' through '...'

Что я не понимаю в раскладе со String?

Переписал объявление на

const char* Dim[] PROGMEM={" ","1","2","3"} так работет ((
 

Сотнег

★★★★★★★
15 Янв 2020
4,482
1,524
@sergz1, в вашем массиве Dim хранятся адреса ячеек памяти PROGMEM, а не строки.

И вряд ли вы строки так легко из них достанете, даже зная адреса.
Лучше забейте на PROGMEM.
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
ну и каша... какой процессор используете-то?
PROGMEM нельзя использовать для объектов типа String.
PROGMEM нельзя использовать для массивов обектов, но можно использовать для массива указателей

sprintf_P(buf, PSTR(%S"---"%S), Dim[1],Dim[2]); используется неверно, во флешром можно помещать только шаблон, но не аргументы для замещения в шаблоне. Вообще это не имеет смысла, зачем в одну статическую строку впечатывать другие статические строки?
проще сделать так
Код:
const char* some[] PROGMEM = "bla---bla";
или так
Код:
String buff();
buff.reserve(100);
buff = dim[1];
buff += F("---");
buff += dim[2];
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
540
87
int NUMPIXELS1[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 16, 19, 22, 36, 39, 42, 45, 48 }; Эту строчку можно использовать в
PROGMEM? Если можно то как.
 

poty

★★★★★★✩
19 Фев 2020
3,279
951
@VictorArx, давайте начнём с чисел, которые хранятся в архиве, они точно должны быть int? Т.е., Вы хотите управлять лентой, длиной более 256 пикселей?
Если достаточно 256 пикселей (или можно организовать симметрию - тогда до 512 пикселей), то тип можно сделать byte и разместить его в памяти. Для чтения из PROGMEM есть макросы, найдите урок у Гайвера про них.
Если в byte не влезает, то придётся читать каждый элемент по 2 раза (снова смотрите уроки Гайвера), но всё равно разместить можно.
 
  • Лойс +1
Реакции: VictorArx

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
@VictorArx,
зависит от того что в вашем понятии "использовать". Для начала какой контроллер обсуждается, блин? PROGMEM это не магическое заклинание которое можно воткнуть куда угодно и у вас появится бесплатная память. Надо понимать как это работает на конкретной платформе, какой ценой и имеет ли это смысл вообще.
Приведу пример жизненный - хранить на чердаке искуственную ёлку что бы не мешалась в шкафу имеет смысл, раз в год достал на 2 недели, потом убрал. Хранить на чердаке паяльник которым вы пользуетесь 2 раза в неделю смысла не имеет - придется за ним постоянно лазить и убирать обратно.

Отвечая на ваш вопрос в общем случае - да можно, делается это так
static const int NUMPIXELS1[] PROGMEM = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 16, 19, 22, 36, 39, 42, 45, 48 };
 
  • Лойс +1
Реакции: VictorArx