Проблемы с макросами препроцессора - PullRequest
0 голосов
/ 21 мая 2018

Я хотел написать функцию печати журнала отладки для моего конечного автомата, которая печатает текущее состояние, время в миллисекундах и затем мое сообщение.Тем не менее, я получаю случайные результаты.Вот что я сделал:

#define DEBUG_PRINT(tag, format, ...) printf("[%10s] %7d: " format "\n", tag, millis(), ##__VA_ARGS__)

Когда я бегу:

DEBUG_PRINT("SETUP", "%d %d %d %d", 1, 2, 3, 4);

Я ожидаю получить: [ SETUP] 0: 1 2 3 4
Но я получаю: [ SETUP] 0: 0 1 2 3

При добавлении% d получим «4», но я все еще получаю ложное 0.

Мой предыдущий макрос журнала дебюта: DEBUG_PRINT1("%d %d %d %d", 1, 2, 3, 4); печатает ожидаемый 1 2 3 4.

Можете ли вы помочь мне избавиться от этого лишнего 0?

1 Ответ

0 голосов
/ 21 мая 2018

Проблема в том, что функция millis() возвращает unsigned long, где в качестве идентификатора используется целое число %d.

Измените его на %7ld, и оно должно работать нормально.

Я проверял это.

edit 1:

Я также проверял это в системе linux.В системе linux это не является проблемой, поскольку размер linux int равен 4 байта, а long равен 8 байтов.

Однако на Arduino размер int равен 2байтов и long составляет 4 байта.Это завинчивает идентификатор %d на Arduino и расширяет unsigned long с millis() до следующего %d

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...