реклама на сайте
подробности

 
 
> Convert 16-bit integer to ASCII with comma and signum, сделайте красиво
ViKo
сообщение Sep 7 2017, 11:44
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Есть 16-битовый знаковый результат с АЦП, нужно написать его в виде строки с целой и дробной частями и точкой в заданной позиции. Например, 336 нужно изобразить в виде +3.36. С выравниванием по правому краю. Рабочий пример показываю ниже. Использую буфер на 8 символов. Конец строки тоже входит в буфер, и поэтому число -0.32109 не помещается, будет выводиться в виде -.32109 (может, и не стоило так ограничиваться, но это позже всплыло). Пример не очень нравится, просто на скорую руку слепил. Если кому интересно поупражняться в программировании, покажите, как можно.
CODE

/*!*************************************************************************
@brief 16-bit integer convert to ASCII with comma and signum
@param num - число для преобразования
@param str - строка из 8 символов: знак, цифры, точка, конец строки
@param pointpos - позиция точки в строке (1..6, количество мест перед ней)
@param showplus - записывать символ '+'
@note при pointpos = 0, > 6 - точка не ставится
*/
void Half2TextPoint_conv(int16_t num, char *str, uint32_t pointpos, bool showplus)
{
char *strleft = str; // левая граница строки (только для знака)
*(uint32_t *)(str ) = ' ' | ' ' << 8 | ' ' << 16 | ' ' << 24;
*(uint32_t *)(str + 4) = ' ' | ' ' << 8 | ' ' << 16 | '\0'<< 24;
bool fract = true; // дробная часть рассчитана или не нужна
if (pointpos >= 1 && pointpos <= 6) {
*(str + pointpos) = '.';
fract = false; // дробная часть нужна, пока не получена
}
char sign = ' ';
if (showplus)
sign = '+';
if (num < 0) {
sign = '-';
num = -num;
}
str += 6;
do {
if (*str == '.') {
str--;
fract = true;
}
*str = num % 10 + '0';
str--;
} while ((num /= 10) || !fract); // пока нужна дробная часть
if (str < strleft) str++; // проскочили из-за запятой в поз. 1 и числа < 1
*str = sign;
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
bw429
сообщение Sep 8 2017, 10:31
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 12-01-17
Пользователь №: 94 975



А printf может всегда выводить знак, даже если "+"?
Go to the top of the page
 
+Quote Post
k155la3
сообщение Sep 8 2017, 16:31
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(bw429 @ Sep 8 2017, 13:31) *
А printf может всегда выводить знак, даже если "+"?

Да.
%-012.2f
Точно не понмю, но печатал всегда со знаком.
Вопрос в "ведущих" нулях. Надо курить реализацию форматов printf
на конкретном компиляторе, а также зависит от подулюченных библиотек.
Для IAR/MSP430 - отличается CLIB / DLIB



Цитата(ViKo @ Sep 8 2017, 13:42) *
. . . .

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

#define MyPrint(target, var, point_left_, point_right) \
sprintf( target, "%*.*f", point_left, point_right, &var) \

В работе я эту конструкцию не проверял, небыло необходимости.
Получится или нет - надо курить док на printf.

Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016