Непонятки с преобразованием int в char
- Войдите на сайт для отправки комментариев
Не могу понять что происходит. Обычно пытаюсь выяснить проблему самостоятельно но как-то не силен в 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.
ИЗвините за сумбурность, просто не умею задвать вопросы...
У вас буфер в 3 символа для трёхсимвольного представления числа 120. Не находите, что буфер маловат, как минимум на 1 символ под нуль-терминатор? ;)
Возможно, но не сам придумал, пока учусь на примерах) Но в данном случае я пробовал ставить больше (и ранее и сейчас, после вашего замечания) но все равно та же фигня.
для 7219 есть пристойная библиотека LedControl. Все описанные страсти для неё не нужны.
для 7219 есть пристойная библиотека LedControl. Все описанные страсти для неё не нужны.
какие "страсти"? это преобразование int в char - страсти что ли? При чем здесь библиотека? У человека проблемы с преобразованием типов...
Nefelisk, код преобразования у вас нормальный. Обязательно увеличьте размер буфера - он должен быть равен максимальной длине строки +1 символ. Это нужно независимо от того, решит это проблему с выводом чисел или нет. Необходимость этого даже смешно обсуждать.
Что касается источника ошибок - я вижу два варианта. Либо значение буфера портится до вывода на экран - например, вы ошиблись с размером еще какого-то массива, как в случае с буфером - и этот массив затирает данные в массиве буфер.
Либо проблемы с выводом байтов из массива.
Предлагаю в вашей диагностике после побайтного вывода вставить еще один строковый.
Именно, спасибо за поддержку). Я заметил, что если указать:
сохранив, как я понимаю, память за ней в этом окружении то проблема частично пропала.
Я имею очень смутное представление работы с памятью, но казалось бы больших проблем быть не должно если ее достаточно свободной...
Куда стоит смотреть что бы выяснить проблему?
Nefelisk, код преобразования у вас нормальный. Обязательно увеличьте размер буфера - он должен быть равен максимальной длине строки +1 символ. Это нужно независимо от того, решит это проблему с выводом чисел или нет. Необходимость этого даже смешно обсуждать.
Что касается источника ошибок - я вижу два варианта. Либо значение буфера портится до вывода на экран - например, вы ошиблись с размером еще какого-то массива, как в случае с буфером - и этот массив затирает данные в массиве буфер.
Либо проблемы с выводом байтов из массива.
Предлагаю в вашей диагностике после побайтного вывода вставить еще один строковый.
Ооо, спасбио, буду смотреть.
для 7219 есть пристойная библиотека LedControl. Все описанные страсти для неё не нужны.
какие "страсти"? это преобразование int в char - страсти что ли? При чем здесь библиотека? У человека проблемы с преобразованием типов...
делением на 10 и функцией " % " находим значения десятичных разрядов и отправляем их на индикатор - см. setDigit().
для 7219 есть пристойная библиотека LedControl. Все описанные страсти для неё не нужны.
какие "страсти"? это преобразование int в char - страсти что ли? При чем здесь библиотека? У человека проблемы с преобразованием типов...
делением на 10 и функцией " % " находим значения десятичных разрядов и отправляем их на индикатор - см. setDigit().
Допустим так, но это не отменяет проблемы текущей, в которой неплохо было бы разобраться. Тем более просто с setDigit() в базовом виде не получиться рисовать цифры того размера которого мне нужно.
Мужики, ну сколько можно шары тереть?!? Десятый пост уже! Обсуждаем ошибку в скетче! Нам скетч то блин покажут или так и будем пальцем в небо?
Nefelisk, код преобразования у вас нормальный. Обязательно увеличьте размер буфера - он должен быть равен максимальной длине строки +1 символ. Это нужно независимо от того, решит это проблему с выводом чисел или нет. Необходимость этого даже смешно обсуждать.
Что касается источника ошибок - я вижу два варианта. Либо значение буфера портится до вывода на экран - например, вы ошиблись с размером еще какого-то массива, как в случае с буфером - и этот массив затирает данные в массиве буфер.
Либо проблемы с выводом байтов из массива.
Предлагаю в вашей диагностике после побайтного вывода вставить еще один строковый.
Спасибо, в итоге так и оказалось. Копировал strcpy() строку, например, длиной в 7 символов в char длиной 4)... Балбес, что сказать)