Отображение даты на TFT без использования массива чисел в виде символов - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь записать день месяца на TFT-дисплей из экземпляра DateTime. Данные для экземпляра DateTime поступают из RT C.

По сути, я пытаюсь сделать это:

DateTime timenow;
timenow = rtc.now();                      // Get and store the current RTC data as DateTime.
tft.textWrite(timenow.day());             // This doesn't work (see below), but it shows the idea of what I am trying to do.

tft.textWrite принимает char как его параметр, но timenow.day(), кажется, выводит int. Единственный способ заставить его работать (, что, как вы увидите, ), очевидно, не очень хороший способ, - создать огромный массив со всеми числами от 1 до 31 в виде char:

const char days[31][3] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"};

Затем я использовал массив в своем коде:

DateTime timenow;
timenow = rtc.now();                      // Get and store the current RTC data as DateTime.
tft.textWrite(days[timenow.day() - 1]);

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

Мой вопрос, может кто-нибудь сказать мне, как я могу преобразовать из int в char для использования в эта функция без необходимости огромного массива?

Я перепробовал все от String(timenow.day()) до char(timenow.day()) до таких вещей, как char(String(timenow.day())) и ни один из них, кажется, не работает.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Если вы используете c ++ 11, вы можете использовать to_string примерно так: tft.textWrite (std :: to_string (timenow.day ()). C_str ())

0 голосов
/ 08 апреля 2020

Вам необходимо преобразовать целое число в строку.

    int day = timenow.day();
    char str[12];
    sprintf(str, "%d", day);
    tft.textWrite(str);

РЕДАКТИРОВАТЬ:

Объяснение кода:

  • Во-первых, мы сохраняем целочисленное значение timenow.day() в day;
  • Затем мы объявляем массив char для хранения преобразования int day в char. It will be used in the sprintf () function call. This char array must be big enough to hold the conversion string. So that is why I used char str [12] `здесь. Итак, у нас есть 12 байтов для хранения преобразованного значения.

  • sprintf(str, "%d", day) принимает char * в качестве первого аргумента, где будет сохранено преобразование. Второй аргумент - это формат выходной строки, которую вы хотите получить. Затем следующие аргументы - те, которые требуются для строки формата, которую вы передали, в данном случае это "%d", что означает, что мы должны дать ей целочисленное значение. Вот почему мы передаем переменную day в качестве последнего аргумента.

Подробнее о возможностях sprintf можно узнать, запустив man sprintf в своем терминале Linux. В противном случае вы можете получить больше информации здесь .

...