Непонятки с преобразованием int в char

Nefelisk
Offline
Зарегистрирован: 09.09.2017

Не могу понять что происходит. Обычно пытаюсь выяснить проблему самостоятельно но как-то не силен в C, и даже не знаю куда смотреть.

Есть, допустим глобальная переменная с числом 120. Периодически число меняеться и выводиться на матричный MAX7219, для чего преобразовывается в char для побайтного отрисовывания на экране. Двумя вариантами (для теста)

int n               =    120;
char buffer[3]      =    "  ";
sprintf(buffer, "%d", n); //или itoa(n,buffer,10);

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

int: 120 >> sprintf(buffer, "%d", int): 120 >> sizeof buffer: 3 >> buffer[0], buffer[1], buffer[2] : 1,2,0
int: 120 >> itoa(minutes,buffer,10): 120 >> sizeof buffer: 3 >> buffer[0], buffer[1], buffer[2] : 1,2,0
int: 119 >> sprintf(buffer, "%d", int): 119 >> sizeof buffer: 3 >> buffer[0], buffer[1], buffer[2] : 1,1,9
int: 119 >> itoa(minutes,buffer,10): 119 >> sizeof buffer: 3 >> buffer[0], buffer[1], buffer[2] : 1,1,9

Но спутя некоторые действия (преположим это у меня часы, а данное число количество минут таймера, но в часах есть настройки в которые можно зайти и что-то там сделать) например вызов настроек и просто выход из них приводит к тому что число вроде бы нормальное и как число и как char одной строкой, но если выводить его побайтно, оно превращаеться в квадратики:

int: 119 >> sprintf(buffer, "%d", int): 119 >> sizeof buffer: 3 >> buffer[0], buffer[1], buffer[2] : ⸮,⸮,⸮
int: 119 >> itoa(minutes,buffer,10): 119 >> sizeof buffer: 3 >> buffer[0], buffer[1], buffer[2] : ⸮,⸮,⸮
 

Скетч занимает 56%, переменные 47%. Arduino UNO.

ИЗвините за сумбурность, просто не умею задвать вопросы...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

У вас буфер в 3 символа для трёхсимвольного представления числа 120. Не находите, что буфер маловат, как минимум на 1 символ под нуль-терминатор? ;)

Nefelisk
Offline
Зарегистрирован: 09.09.2017

Возможно, но не сам придумал, пока учусь на примерах) Но в данном случае я пробовал ставить больше (и ранее и сейчас, после вашего замечания) но все равно та же фигня.

SLKH
Offline
Зарегистрирован: 17.08.2015

для 7219 есть пристойная библиотека LedControl. Все описанные страсти для неё не нужны. 

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

SLKH пишет:

для 7219 есть пристойная библиотека LedControl. Все описанные страсти для неё не нужны. 

какие "страсти"? это преобразование int в char - страсти что ли? При чем здесь библиотека? У человека проблемы с преобразованием типов...

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

Nefelisk, код преобразования у вас нормальный. Обязательно увеличьте размер буфера - он должен быть равен максимальной длине строки +1 символ. Это нужно независимо от того, решит это проблему с выводом чисел или нет. Необходимость этого даже смешно обсуждать.

Что касается источника ошибок - я вижу два варианта. Либо значение буфера портится до вывода на экран - например, вы ошиблись с размером еще какого-то массива, как в случае с буфером - и этот массив затирает данные в массиве буфер.

Либо проблемы с выводом байтов из массива.

Предлагаю в вашей диагностике после побайтного вывода вставить еще один строковый.

Nefelisk
Offline
Зарегистрирован: 09.09.2017

Именно, спасибо за поддержку). Я заметил, что если указать:

static char buffer[10];

сохранив, как я понимаю, память за ней в этом окружении то проблема частично пропала.

Я имею очень смутное представление работы с памятью, но казалось бы больших проблем быть не должно если ее достаточно свободной...

Куда стоит смотреть что бы выяснить проблему?

Nefelisk
Offline
Зарегистрирован: 09.09.2017

b707 пишет:

Nefelisk, код преобразования у вас нормальный. Обязательно увеличьте размер буфера - он должен быть равен максимальной длине строки +1 символ. Это нужно независимо от того, решит это проблему с выводом чисел или нет. Необходимость этого даже смешно обсуждать.

Что касается источника ошибок - я вижу два варианта. Либо значение буфера портится до вывода на экран - например, вы ошиблись с размером еще какого-то массива, как в случае с буфером - и этот массив затирает данные в массиве буфер.

Либо проблемы с выводом байтов из массива.

Предлагаю в вашей диагностике после побайтного вывода вставить еще один строковый.

Ооо, спасбио, буду смотреть.

SLKH
Offline
Зарегистрирован: 17.08.2015

b707 пишет:

SLKH пишет:

для 7219 есть пристойная библиотека LedControl. Все описанные страсти для неё не нужны. 

какие "страсти"? это преобразование int в char - страсти что ли? При чем здесь библиотека? У человека проблемы с преобразованием типов...

да не нужно ничего в char преобразовывать, с массивами  и пр.

делением на 10 и функцией  " % " находим значения десятичных разрядов и отправляем их на индикатор - см.  setDigit().

 

Nefelisk
Offline
Зарегистрирован: 09.09.2017

SLKH пишет:

b707 пишет:

SLKH пишет:

для 7219 есть пристойная библиотека LedControl. Все описанные страсти для неё не нужны. 

какие "страсти"? это преобразование int в char - страсти что ли? При чем здесь библиотека? У человека проблемы с преобразованием типов...

да не нужно ничего в char преобразовывать, с массивами  и пр.

делением на 10 и функцией  " % " находим значения десятичных разрядов и отправляем их на индикатор - см.  setDigit().

 

Допустим так, но это не отменяет проблемы текущей, в которой неплохо было бы разобраться. Тем более просто с setDigit() в базовом виде не получиться рисовать цифры того размера которого мне нужно.

 

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

Мужики, ну сколько можно шары тереть?!? Десятый пост уже! Обсуждаем ошибку в скетче! Нам скетч то блин покажут или так и будем пальцем в небо?

Nefelisk
Offline
Зарегистрирован: 09.09.2017

b707 пишет:

Nefelisk, код преобразования у вас нормальный. Обязательно увеличьте размер буфера - он должен быть равен максимальной длине строки +1 символ. Это нужно независимо от того, решит это проблему с выводом чисел или нет. Необходимость этого даже смешно обсуждать.

Что касается источника ошибок - я вижу два варианта. Либо значение буфера портится до вывода на экран - например, вы ошиблись с размером еще какого-то массива, как в случае с буфером - и этот массив затирает данные в массиве буфер.

Либо проблемы с выводом байтов из массива.

Предлагаю в вашей диагностике после побайтного вывода вставить еще один строковый.

Спасибо, в итоге так и оказалось. Копировал strcpy() строку, например, длиной в 7 символов в char длиной 4)... Балбес, что сказать)