Использование макроса F

k4889
Offline
Зарегистрирован: 10.02.2017

Всем добрый день. Не могу найти ответ, как использовать макрос F с переменной.

Возможно ли это вообще ?

F("Строка") помещается в память, а вот строка + переменная не работает.

int value = 1;
lcd.clear();

lcd.setCursor(0, 0);
lcd.print(F("Какой-то текст")); // Это работает

lcd.setCursor(0, 1);    
lcd.print("Значение: " + value); // Как сюда засунуть F не понятно, если это вообще возможно

 

b707
Offline
Зарегистрирован: 26.05.2017

ну вот сами-то подумайте... макрос F() размещает строку во флеш. Во флеше по определению не может быть переменных, только константы.

Во-втором случае просто разбейте оператор на два вывода lcd.print

k4889
Offline
Зарегистрирован: 10.02.2017

b707 пишет:

Во-втором случае просто разбейте оператор на два вывода lcd.print

А вот тут я как-то не догадался сразу. Спасибо. 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

А если обернуть в F только саму строку и к этому конкатенировать переменную?

lcd.setCursor(0, 1);   
lcd.print(F("Значение: ") + value); // Как сюда засунуть F не понятно, если это вообще возможно

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Yarik.Yar пишет:

А если обернуть в F только саму строку и к этому конкатенировать переменную?

lcd.setCursor(0, 1);   
lcd.print(F("Значение: ") + value); // Как сюда засунуть F не понятно, если это вообще возможно

 

Если мы бьемся за экономию оперативной памяти, то так поступать не следует, а если оперативную память экономить не нужно, то и целесообразность использования макроса F() вызывает сомнения.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

andriano пишет:

если оперативную память экономить не нужно, то и целесообразность использования макроса F() вызывает сомнения.

Очень хочется понять аргументацию ? Что по вашему жрет озу, временный буфер для вывода сообщения ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Да. Стек и куча расположены в одном и том же (весьма незначительном) объеме памяти. Соответственно, когда памяти в обрез, "размашистое" использование стека способно привести к краху программы.

k4889
Offline
Зарегистрирован: 10.02.2017

Yarik.Yar пишет:

А если обернуть в F только саму строку и к этому конкатенировать переменную?

lcd.setCursor(0, 1);   
lcd.print(F("Значение: ") + value); // Как сюда засунуть F не понятно, если это вообще возможно

Такой вариант работать не будет. Ошибка компиляци.

k4889
Offline
Зарегистрирован: 10.02.2017

brokly пишет:

Очень хочется понять аргументацию ? Что по вашему жрет озу, временный буфер для вывода сообщения ?

Использование F() где-то в 15 строках освободило около 200 байт оперативки на Nano, где суммарный размер оперативной памяти 2048 байт. Очень не плохо, если программа большая, если просто мигать светодиодом, то использовать F() или PROGMEM смысла не имеет.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Yarik.Yar пишет:

А если обернуть в F только саму строку и к этому конкатенировать переменную?

lcd.setCursor(0, 1);   
lcd.print(F("Значение: ") + value); // Как сюда засунуть F не понятно, если это вообще возможно

Это шутка?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

На самом деле компилятор пишет объем памяти занимаемый глобальными переменными. А есть еще локальные, которые в какие то моменты времени занимают память, а в какие то - нет. Но могу однозначно утверждать, что хранение текстовых массивов во флеше, при правильном использовали, однозначно улучшают ситуацию с использованием оперативки.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

brokly пишет:
Но могу однозначно утверждать, что хранение текстовых массивов во флеше, при правильном использовали, однозначно улучшают ситуацию с использованием оперативки.

brokly, Вы сами ответили на свой вопрос в посте №5: под константы из PROGMEM надо использовать на месте, не следует создавать в ОЗУ объектов, хотя бы частично дублирующих константы из PROGMEM.