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

 
 
> Вопрос С
badik
сообщение Jun 24 2010, 18:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 29-11-06
Из: Екатеринбург
Пользователь №: 22 890



Здравствуйте, Вопрос к людям хорошо знающим С.
Понадобилась функция перевода целого числа в строку. Перерыл спрвочник и help - результат 0.
Банальная проблема. Увы. Обраных функций вагон.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Непомнящий Евген...
сообщение Jun 26 2010, 09:16
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



В свое время написал такое:
CODE

/**
* "Указатель" на тетраду байта (обертка над указателем и признаком первая\вторая тетрада)
*/
struct TBCDLocation
{
byte *buf;
bool isFH;

TBCDLocation(byte *buf = 0, bool isFH = true) { this->buf = buf; this->isFH = isFH; }

TBCDLocation& operator++();
TBCDLocation& operator--();
TBCDLocation& operator+=(byte b );
TBCDLocation& operator-=(byte b );
uint_fast16_t operator-(const TBCDLocation& b ) const;
uint_fast16_t operator-(byte *b ) const;
TBCDLocation operator-(uint_fast8_t b ) const;
TBCDLocation operator+(uint_fast8_t b ) const;
bool operator==(const TBCDLocation& b ) const;
bool operator!=(const TBCDLocation& b ) const;
bool operator>(const TBCDLocation& b ) const;

void put(byte val);
void putAndInc(byte val);
void putAndDec(byte val);
byte get();
byte getAndInc();
byte getAndDec();
};

struct TBINtoBCDres
{
TBCDLocation loc; //!< Указатель на цифру перед первой результата
bool isOverflow : 1; //!< признак переполнения
bool isMinus : 1; //!< знак
TBINtoBCDres (TBCDLocation loc, bool isOverflow, bool isMinus) : loc(loc), isOverflow(isOverflow), isMinus(isMinus) {}
};

/**
* Преобразование двоичного числа произвольной длины в десятичное число произвольной длины
* (две цифры в байте). Результат выравнивается по правому краю.
* Заполнение ведущими нулями НЕ производится (в частности, при преобразовании числа 0
* целевой массив НЕ ИЗМЕНИТСЯ вообще и будет возвращен lsBCD).\n
* Если десяичное число не влезает в указанное число разрядов,
* старшие разряды будут потеряны (т.е. 0xffff при преобразовании
* в три разряда даст 535)\n
* Двоичное число лежит младшим байтом вперед. Десятичное - старшей цифрой вперед.
*
* @param lsBCD указатель на младшую цифру результата (самую последнюю)
* @param bin указатель на младший байт двоичного числа (самый первый)
* @param halfbyteCnt
* число тетрад в двоичном числе
* @param bcdDigCnt число цифр в десятичном числе
*
* @return Указатель на цифру перед первой результата и признак переполнения
*/
TBINtoBCDres BINtoBCD(TBCDLocation lsBCD, void const *bin, uint_fast8_t halfbyteCnt, uint_fast8_t bcdDigCnt)
{
// используется сдвиговый алгоритм (полубайты выдвигаются из двоичного регистра и вдвигаются
// в десятичный, при этом произодится коррекция) Число итераций = (число байт) * (число дес цифр)
TBCDLocation msBCD = lsBCD;
bool isOverflow = false;
byte *pbin = ((byte*)bin) + (halfbyteCnt/2)-1;
bool binIsFH = true;
uint_fast8_t tmp;
while(halfbyteCnt--)
{
uint_fast8_t sdv; // выдвинутый полубайт
if (binIsFH)
{
tmp = *pbin--;
sdv = HIGHPART(tmp);
binIsFH = false;
}
else
{
sdv = LOWPART(tmp);
binIsFH = true;
}
TBCDLocation bcd(lsBCD);
while(true) // вдвигаем полубайт в десятичный регистр
{
bool isLim = msBCD == bcd; // признак достижения старшей цифры
if(isLim && sdv == 0) break;

uint_fast8_t cur = isLim ? 0 : bcd.get();
uint_fast8_t tmp = tableBINtoBCD[(cur<<4) | sdv];
cur = HIGHPART(tmp);
sdv = LOWPART(tmp);
if (isLim)
{
if (cur || sdv)
{
if (bcdDigCnt)
{
bcd.putAndDec(cur);
--bcdDigCnt;
msBCD = bcd;
}
else
{
isOverflow = true;
break;
}
}
else
break;
}
else
bcd.putAndDec(cur);
}
}
return TBINtoBCDres(msBCD, isOverflow, false);
}


Таблицу tableBINtoBCD (160 байт) и класс TBCDLocation могу дать, если кому интересно. Написано на С++, но можно переделать на С.

Когда написал, сравнил (на IAR АВР) с двумя алгоритмами - первый использовал деление, второй - вычитание. Цифр уже не помню, но оказался быстрее обоих. Кроме того работает с числами произвольной длины (несколько раз понадобилось smile.gif ) и контролирует переполнение.

Конвертит не в АСКи, а в BCD - две десятичных цифры в байте - но потом легко преобразовать куда надо.

ЗЫ смайлы почему-то парсятся в коде...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- badik   Вопрос С   Jun 24 2010, 18:29
- - DRUID3   atoi()/itoa(); Или что-то отсюда...   Jun 24 2010, 18:43
- - Genadi Zawidowski   Тут или пользоваться sprintf (или её вариантами - ...   Jun 24 2010, 18:57
- - ViKo   В свое время я задавал такой же вопрос. Получил не...   Jun 25 2010, 11:29
|- - zltigo   QUOTE (ViKo @ Jun 25 2010, 14:29) Сам нап...   Jun 25 2010, 11:38
||- - sonycman   Цитата(zltigo @ Jun 25 2010, 15:38) Совет...   Jun 25 2010, 12:15
||- - ViKo   Цитата(zltigo @ Jun 25 2010, 14:38) Совет...   Jun 25 2010, 12:21
|- - jorikdima   Цитата(ViKo @ Jun 25 2010, 15:29) В свое ...   Jun 25 2010, 12:17
|- - defunct   Цитата(ViKo @ Jun 25 2010, 14:29) Сам нап...   Jun 25 2010, 16:48
|- - ssvSerge   Цитата(defunct @ Jun 25 2010, 19:48) Друг...   Jun 25 2010, 17:26
- - zltigo   QUOTE (sonycman @ Jun 25 2010, 15:15) Что...   Jun 25 2010, 12:24
|- - ViKo   Цитата(zltigo @ Jun 25 2010, 15:24) ...ли...   Jun 25 2010, 12:31
||- - sonycman   Цитата(ViKo @ Jun 25 2010, 16:31) Оставил...   Jun 25 2010, 12:38
||- - zltigo   QUOTE (sonycman @ Jun 25 2010, 15:38) Осо...   Jun 25 2010, 12:57
||- - ViKo   Цитата(zltigo @ Jun 25 2010, 15:57) В дан...   Jun 25 2010, 13:06
||- - sonycman   Цитата(zltigo @ Jun 25 2010, 16:57) Ну дл...   Jun 25 2010, 13:13
||- - aaarrr   Цитата(sonycman @ Jun 25 2010, 17:13) Нер...   Jun 25 2010, 13:14
|- - ViKo   Цитата(zltigo @ Jun 25 2010, 15:24) лучше...   Jun 25 2010, 12:50
|- - zltigo   QUOTE (ViKo @ Jun 25 2010, 15:50) У вас е...   Jun 25 2010, 13:28
|- - ViKo   Цитата(zltigo @ Jun 25 2010, 16:28) как и...   Jun 25 2010, 13:34
|- - zltigo   QUOTE (ViKo @ Jun 25 2010, 16:34) нужно п...   Jun 25 2010, 13:39
|- - ViKo   Цитата(zltigo @ Jun 25 2010, 16:39) Про ...   Jun 25 2010, 13:43
|- - aaarrr   Цитата(ViKo @ Jun 25 2010, 17:43) И к код...   Jun 25 2010, 14:49
- - aaarrr   Просто как пример: Кодunsigned int short2str(c...   Jun 25 2010, 12:41
- - zltigo   QUOTE (ViKo @ Jun 25 2010, 16:43) Это у в...   Jun 25 2010, 13:56
|- - ViKo   Цитата(zltigo @ Jun 25 2010, 16:56) Ну эт...   Jun 25 2010, 14:04
||- - zltigo   QUOTE (ViKo @ Jun 25 2010, 17:04) О! ...   Jun 25 2010, 14:10
||- - ViKo   Цитата(zltigo @ Jun 25 2010, 17:10) Ну, н...   Jun 25 2010, 16:15
||- - Genadi Zawidowski   Цитата(ViKo @ Jun 25 2010, 20:15) А разве...   Jun 25 2010, 20:33
||- - ViKo   Цитата(Genadi Zawidowski @ Jun 25 2010, 23...   Jun 25 2010, 21:29
||- - ReAl   Цитата(Genadi Zawidowski @ Jun 25 2010, 23...   Jun 26 2010, 09:04
||- - sonycman   Цитата(ReAl @ Jun 26 2010, 13:04) Оптимиз...   Jun 26 2010, 09:23
||- - demiurg_spb   Цитата(ReAl @ Jun 26 2010, 13:04) Так что...   Jun 27 2010, 18:51
|- - sonycman   Цитата(zltigo @ Jun 25 2010, 17:56) А то,...   Jun 25 2010, 14:55
|- - zltigo   QUOTE (sonycman @ Jun 25 2010, 17:55) Буд...   Jun 25 2010, 16:30
- - Goodefine   Когда то для дисплея (отсюда фиксированное число ц...   Jun 25 2010, 16:19
|- - ViKo   Цитата(Goodefine @ Jun 25 2010, 19:19) vo...   Jun 25 2010, 17:16
- - ViKo   Пролистал K&R второе издание от корки до корки...   Jun 25 2010, 19:15
|- - aaarrr   Цитата(ViKo @ Jun 25 2010, 23:15) Найти б...   Jun 25 2010, 19:20
|- - dimka76   Цитата(ViKo @ Jun 25 2010, 23:15) Пролист...   Jun 26 2010, 04:36
|- - zltigo   QUOTE (ViKo @ Jun 25 2010, 22:15) Пролист...   Jun 26 2010, 08:11
|- - ViKo   Цитата(zltigo @ Jun 26 2010, 11:11) Не об...   Jun 26 2010, 09:08
|- - zltigo   QUOTE (ViKo @ Jun 26 2010, 12:08) А я для...   Jun 26 2010, 09:18
- - sigmaN   K&R не Ымбеддеры. А zltigo дело говорит вам. К...   Jun 25 2010, 19:27
- - ViKo   Покопался в своих проектах, нашел преобразование д...   Jun 25 2010, 19:52
- - ViKo   Следуя рекомендациям, слегка модернизировал код. К...   Jun 26 2010, 10:24
|- - ssvSerge   Цитата(ViKo @ Jun 26 2010, 14:24) Следуя ...   Jun 26 2010, 11:31
|- - zltigo   QUOTE (ViKo @ Jun 26 2010, 13:24) Для все...   Jun 26 2010, 15:05
|- - ViKo   Цитата(zltigo @ Jun 26 2010, 18:05) // За...   Jun 26 2010, 16:28
|- - zltigo   QUOTE (ViKo @ Jun 26 2010, 19:28) Sign - ...   Jun 26 2010, 16:40
|- - aaarrr   Цитата(ViKo @ Jun 26 2010, 20:28) 2 aaarr...   Jun 26 2010, 16:51
- - ViKo   2 ssvSerge В ваших алгоритмах число записывается з...   Jun 26 2010, 13:55
|- - ssvSerge   Цитата(ViKo @ Jun 26 2010, 16:55) В алгор...   Jun 26 2010, 14:19
|- - ViKo   Цитата(ssvSerge @ Jun 26 2010, 17:19) ну ...   Jun 26 2010, 14:42
|- - ssvSerge   Цитата(ViKo @ Jun 26 2010, 18:42) для мен...   Jun 26 2010, 15:12
|- - aaarrr   Цитата(ViKo @ Jun 26 2010, 18:42) В данны...   Jun 26 2010, 15:14
- - ViKo   Спасибо всем! На сегодня и завтра - умолкаю. ...   Jun 26 2010, 17:00
|- - sonycman   Цитата(ViKo @ Jun 26 2010, 21:00) Возраду...   Jun 27 2010, 17:02
- - badik   Господа всем огромный привет, ни как не думал, что...   Jun 28 2010, 17:43
- - ViKo   Прежде, чем писать новое, изучил в отладчике работ...   Jun 28 2010, 21:09
|- - zltigo   QUOTE (ViKo @ Jun 29 2010, 00:09) Заносит...   Jun 28 2010, 21:33
|- - ViKo   Цитата(zltigo @ Jun 29 2010, 00:33) Их у ...   Jun 28 2010, 21:57
|- - zltigo   QUOTE (ViKo @ Jun 29 2010, 00:57) Перед ...   Jun 28 2010, 22:03
|- - ViKo   2 zltigo Непременно. Выставил две "галки...   Jun 29 2010, 08:29
- - ViKo   Кодvoid itoad(int number, uint8_t *string...   Jun 29 2010, 13:48
|- - Сергей Борщ   Цитата(ViKo @ Jun 29 2010, 16:48) Код *...   Jun 29 2010, 14:18
|- - ViKo   Цитата(Сергей Борщ @ Jun 29 2010, 17:18) ...   Jun 29 2010, 14:29
|- - zltigo   QUOTE (Сергей Борщ @ Jun 29 2010, 17:18) ...   Jun 29 2010, 14:34
||- - ViKo   Цитата(zltigo @ Jun 29 2010, 17:34) *(uin...   Jun 29 2010, 14:39
|||- - zltigo   QUOTE (ViKo @ Jun 29 2010, 17:39) Кавычки...   Jun 29 2010, 14:45
||- - ViKo   Цитата(zltigo @ Jun 29 2010, 17:34) Код ...   Jun 29 2010, 17:23
||- - zltigo   QUOTE (ViKo @ Jun 29 2010, 20:23) Так - н...   Jun 29 2010, 17:40
||- - ViKo   Цитата(zltigo @ Jun 29 2010, 20:40) Код ...   Jun 29 2010, 18:29
||- - zltigo   QUOTE (ViKo @ Jun 29 2010, 21:29) В смысл...   Jun 29 2010, 18:38
||- - ViKo   Цитата(zltigo @ Jun 29 2010, 21:38) Вот к...   Jun 29 2010, 19:52
||- - zltigo   QUOTE (ViKo @ Jun 29 2010, 22:52) Во всех...   Jun 29 2010, 21:13
|- - ViKo   Цитата(Сергей Борщ @ Jun 29 2010, 17:18) ...   Jul 1 2010, 08:55
|- - zltigo   QUOTE (ViKo @ Jul 1 2010, 10:55) Только в...   Jul 1 2010, 11:57
|- - ViKo   Цитата(zltigo @ Jul 1 2010, 14:57) Это де...   Jul 1 2010, 12:34
|- - zltigo   QUOTE (ViKo @ Jul 1 2010, 14:34) Давайте ...   Jul 1 2010, 12:38
|- - ViKo   Цитата(zltigo @ Jul 1 2010, 15:38) Думае...   Jul 1 2010, 12:52
|- - zltigo   QUOTE (ViKo @ Jul 1 2010, 14:52) Хочу зна...   Jul 1 2010, 12:55
|- - ViKo   Цитата(zltigo @ Jul 1 2010, 15:55) Посчит...   Jul 1 2010, 13:59
|- - zltigo   QUOTE (ViKo @ Jul 1 2010, 15:59) 2 zltigo...   Jul 1 2010, 14:11
|- - sonycman   Цитата(ViKo @ Jul 1 2010, 17:59) А SDIV r...   Jul 1 2010, 15:24
- - ViKo   Выкладываю ваш вариант. Последнее, что вы написали...   Jun 30 2010, 08:00
- - ViKo   "Шеф, все пропало!..." По команде ...   Jun 30 2010, 09:22
|- - zltigo   QUOTE (ViKo @ Jun 30 2010, 11:22) На всяк...   Jun 30 2010, 19:02
|- - ViKo   Цитата(zltigo @ Jun 30 2010, 22:02) Ну ес...   Jun 30 2010, 20:29
|- - zltigo   QUOTE (ViKo @ Jun 30 2010, 22:29) У вас в...   Jun 30 2010, 21:14
- - ViKo   16-битовая версия (на основе 32-битовой) Кодvoid ...   Jun 30 2010, 11:26
- - MrYuran   Вот никак не могу понять, почему никто до сих пор ...   Jun 30 2010, 11:31
|- - ViKo   Цитата(MrYuran @ Jun 30 2010, 14:31) Вот ...   Jun 30 2010, 11:35
- - ViKo   Напоследок - проверил вариант с преобразованием в ...   Jun 30 2010, 13:12
|- - aaarrr   Цитата(ViKo @ Jun 30 2010, 17:12) Получил...   Jun 30 2010, 13:34
|- - ViKo   Цитата(aaarrr @ Jun 30 2010, 15:34) Ну, э...   Jun 30 2010, 13:44
- - _Pasha   Цитата(MrYuran @ Jun 30 2010, 14:31) Тяжё...   Jun 30 2010, 21:42
- - ViKo   Перепробовал все "извращения" со сравнен...   Jul 2 2010, 09:07
- - ViKo   Думаю, хуже не станет, если я доложу, что уменьшил...   Jul 2 2010, 18:43
2 страниц V   1 2 >


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

 


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


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