Я разрабатываю встроенное приложение ARM. Я застрял в глупой проблеме - у меня есть массив беззнаковых 8-битных целых чисел:
uint8_t days[42] = { 0 };
Он инициализируется некоторыми данными — алгоритм инициализации вводит множество переменных, запутывающих и не имеющих отношения к задаче, поэтому я не буду его здесь публиковать. Я вижу этот массив в списке переменных отладчика и уверен, что он заполнен целочисленными значениями от 0 до 31.
Я хотел бы взять любой элемент этого массива, скажем, 15-й, и преобразовать его в char*
, чтобы его можно было отобразить на моем ЖК-экране. Я переписываю его с помощью функции sprintf
:
char d[3] = { '0', '0', '0' };
sprintf(d, "%d", days[15]);
Только одно замечание: нет, я не могу использовать функцию stdlib
itoa()
, потому что она не соответствует стандартам MISRA-C, которым я обязан следовать.
В результате я получаю только двоичное нулевое значение в моем буфере d
. Любые идеи?
d
неправильно. Если вы хотите, чтобы все значения заканчивались нулем, вам придется использовать\0
вместо0
. Это работает нормально для меня, кстати. - person ForceBru   schedule 16.03.2015sprintf
. Используйтеsnprintf
. Вы можете обнаружить, что ваши проблемы были вызваны переполнением буфера. Вам не нужно инициализироватьd
. - person Steen   schedule 16.03.2015days[15]
кint
? - person Drew McGowen   schedule 16.03.2015int
, он слишком большой и бессмысленный — зачем мне 32-битное целое число для чисел 0-31? - person Michał Szydłowski   schedule 16.03.2015"%d"
предполагает передачуint
вprintf
. Я не говорю хранить массив какint
s, я говорю сделатьsprintf(d, "%d", (int)days[15]);
, т.е. добавить приведение(int)
передdays[15]
. - person Drew McGowen   schedule 16.03.2015printf
всегда продвигает меньшие аргументы доint
. - person zoska   schedule 16.03.2015