Проблема отображения MD_Parola при построении теста

Я использую ESP8266 и плитки с 4-точечной матрицей для отображения часов (обновления с использованием NTP и WiFi). Все работает хорошо, но только когда я создаю текст, используя тип const char*.

Но поскольку я хочу создать текст как sprintf(temp, "12:00"); или char temp[20]="12:00\n;< /code> создает бессмысленный текст.

MD_Parola dotMatrix = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

void updateTime()
{
  char clk[10];
  char dat[10];
  char temp[10];
  sprintf(temp, "12:00"); // <---- этот способ не работает
  const char *t = "12:00"; // <---- этот путь удался
  dotMatrix.displayText(t, PA_CENTER, 0, 0, PA_PRINT, PA_NO_EFFECT);
}

ссылка на библиотеку

Пожалуйста, объясните, как построить текст не как const char*

, 👍0

Обсуждение

Вы не написали, как вы передаете temp функции dotMatrix.displayText(). Вы просто пишете «temp» там, где сейчас пишется «t»? Вы пытались предоставить указатель на temp? Я не уверен в неявной обработке массивов как указателей, но вы можете попробовать что-то вроде &temp или &temp[0], чтобы получить указатель как параметр функции отображения. Вот что я бы попробовал в этом случае, @chrisl

@chrisl - t заменяет temp, как вы просили. &temp не компилируется, а &temp[0] дает тот же результат, что и temp, @Guy . D

Ммм, в документации библиотеки указано, что библиотека не использует внутренний буфер, а указывает на буфер, на который вы указываете указатель. Я не смотрел в библиотеку ближе, но проблема может заключаться в том, что буфер temp выходит за пределы области видимости после выхода из функции, а это означает, что библиотека использует указатель на недопустимое место. Пожалуйста, попробуйте переместить объявление временного буфера в глобальную область., @chrisl

@chrisl - я также прочитал то, что вы сказали, но я не понял, что это должно быть внешним. верно! пожалуйста, опубликуйте как ответ, @Guy . D


1 ответ


Лучший ответ:

1

В документации библиотеки указано:

Библиотека не выделяет память для текстового сообщения

Это говорит о том, что буфер должен быть действителен после выполнения функции displayText(). Но поскольку вы объявляете это внутри своей функции updateTime(), буфер выходит за пределы области действия при выходе из этой функции. Затем пространство памяти может быть повторно использовано остальной частью программы. В этот момент библиотека по-прежнему будет иметь указатель на старое местоположение, хотя теперь этот указатель можно считать недействительным. Таким образом, вы просто читаете, что компилятор решил разместить в этом месте памяти.

Чтобы решить эту проблему, вам нужно оставить переменную буфера в области видимости. Это можно сделать, переместив объявление в глобальную область.

,