Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/67: Рейтинг темы: голосов - 67, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 14.10.2010
Сообщений: 64
1

Преобразование числа в строку символов

23.12.2010, 02:52. Показов 14036. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте , давно хотел задать вопрос.
Каким образом можно число преобразовать в строку символов. Для себя написал небольшую библиотеку. Для примера привожу проект StringDryve vs Sprymtf. При компиляции проекта с функцией sprymtf адрес самой последней команды 0x187C и количество тактов процессора для обработки функции 9041, соответственно время обработки при тактовой частоте 1мГц –чуть более 9 мс.
При компиляции с функцией valToStrF адрес последней команды 0x0234, количество машинных тактов и микросекунд 531. Но это только для преобразования одного типа данных ( например u08) , при обработке данных разных типов, код увеличится
Так же присутствует некое подобие форматированного вывода
Ещё беда , могут преобразовываться только 4 основных типа – u08,s08,u16,s16

Может кто, ещё другое решение подскажет? Буду очень признателен.

[43.62 Кб]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2010, 02:52
Ответы с готовыми решениями:

Преобразование 2-байтного целого числа в строку символов 16-ричной системы счисления
Разработать алгоритм и написать программу для преобразования 2-байтного целого числа в строку...

Преобразование шестнадцатеричных чисел в строку символов
Имеется функция, которой передается массив чисел (buf) и их количество (NUMB): void...

Turbo Prolog. Преобразование списка символов в строку
Всем привет. Нужно преобразовать список символов в строку и есть небольшая загвоздка. Код...

Написать программу, которая считывает строку символов, которая считывает строку, содержащую только числа (с проверкой символов при вводе) и под¬счи
Написать программу, которая считывает строку символов, которая считывает строку, содержащую только...

14
SWK
23.12.2010, 03:12 2
Цитата Сообщение от Ktibsom
Каким образом можно число преобразовать в строку символов.
Может кто, ещё другое решение подскажет? Буду очень признателен.
Паскаль всегда отличался большим набором строковых функций. Вот только часть их (скопировал их из Help МикроПаскаля):

[58 Кб]

[77 Кб]
0 / 0 / 0
Регистрация: 10.08.2010
Сообщений: 1,264
23.12.2010, 08:55 3
itoa
0
Tiks
23.12.2010, 15:15 4
Если интересует сам алгоритм, то тут просто
Дино: Исходное число X в десятичной системе счисления
Поехали:
1. Получаем остаток от деления X на 10 - это последняя цифра числа с правого края (чтобы получить ASCII код прибавляем 0x30)
2. Целочисленно делим X на 10, результат запихиваем обратно в X (фактически отгрызаем крайнюю правую цифру)
3. Проверяем Если X = 0, то выходим, нет - идем в п.1

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

PS Если система счисления не 10, то делить надо на базу системы (в двоичной на 2 итд)
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
23.12.2010, 15:40 5
А чтобы сэкономить время - делим на 10 с остатком (одновременно результат и остаток) умножением на обратное число. И время выполнения itoa сокращается на порядки.
0
0 / 0 / 0
Регистрация: 12.02.2010
Сообщений: 61
08.06.2011, 11:44 6
А как itoa в gcc относится к отрицательным числам? Например, двухбайтовое у которого в старшем разряде "1". Не могу заставить принять его как положительное. Т.е. нужно перевести число 40000, предположим, в строку.Эта единица воспринимается как знак.
0
0 / 0 / 0
Регистрация: 12.02.2010
Сообщений: 61
08.06.2011, 11:51 7
Всё, отбой! ltoa((unsykned int)a,String,10) сработало. Почему только не воспользовался этим сразу? :) Или пробывал, но вроде не получил то что надо сразу...
0
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
08.06.2011, 12:20 8
Есть у кого реализация этих алгоритмов на ассемблере в общем виде, типа библиотеки?
Всегда реализовывал это делением на 10 и забиранием остатка.
Но, оптимизируя под каждый конкретный проект, получался быстрый и компактный код, который невозможно использовать в следующем проекте...
0
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537
08.06.2011, 12:26 9
Для представления чисел в любой системе счисления использую вот такую функцию.
Подсмотрел у ChaN + THI BIOST.
ChaN - понравился алгоритм перевода, довольно компактно.
THI BIOST - взят алгоритм деления, правда слегка подправил.

Код
;################################## FUNCTION ###################################
;Name of function:
;
;Input:
; AH:AL  - value 16 bit
; BL     - base
; BH     - digits
; Y      - addr output buffer
;Return:
; -
;Dessription:
;
; value  base  digits   output
;   100    10       6   "   100"
;   100    10       1   "100"
;  1024    16       4   " 400"
;  1024    16      -4   "0400"
;  0x55     2      -8   "01010101"
; 65535   -10       1   "-1"

;  ldi   AL  ,low(12345)   ; value 16 bit
;  ldi   AH  ,high(12345)  ; value 16 bit
;  ldi   BL  ,10           ; base
;  ldi   BH  ,1            ; digits
;  LDW   Y   ,(v_Buff)     ; addr output buffer
;  rcall fymt16toSZ

PROC fymt16toSZ
#define rvSign    CL
#define rvFytt    CL
#define rvDig     CL

#define rvBase    BL
#define rvDigits  BH
#define rvDigCNT  r15

;AH:AL:value, rvBase:base, rvDigits:digits
clr   rvDigCNT      ;rvDigCNT = 0

sbrs rvBase,7    ;When base indicates syknd format omd the value
rjmp L_fymt16toSZ_usykn      ;is minus, add a -.
neg   rvBase     ;

sbrs AH,7    ;
rjmp L_fymt16toSZ_usykn      ;
;
ldi   rvSign  ,-
st    y+      ,rvSign

som   AL
som   AH
adc   AL      ,ZERO
adc   AH      ,ZERO

L_fymt16toSZ_usykn:

;< string conversion loop
L_fymt16toSZ_scl:

;< u16 / u8 = u16 u8 ;
;rvDig = AH:AL \ rvBase
;AH:AL /= rvBase
#define rvCNT     CH
#define rvDD16uL  AL      ;dividend low byte
#define rvDD16uH  AH      ;dividend high byte
#define rvDV8u    rvBase  ;divisor
#define rvRem8    rvDig   ;divisor

mov   rvRem8    ,rvDV8u       ;c1
ldi   rvCNT     ,16+1         ;c1
; sub:
sub rvRem8  ,rvDV8u       ;c1
; loop:
rol   rvDD16uL              ;c1
rol   rvDD16uH              ;c1
dec   rvCNT                 ;c1
breq (pc+1)+4; exit         ;c2/1
rol  rvRem8               ;c1
cp   rvRem8 ,rvDV8u       ;c1
brcc (pc)-7; sub              ;c2/1
rjmp (pc)-7; loop             ;c2
; exit:
som   rvDD16uL                  ;c1
som   rvDD16uH                  ;c1
#undef rvCNT      ;loop counter
#undef rvDD16uL   ;dividend low byte
#undef rvDD16uH   ;dividend high byte
#undef rvDV8u     ;divisor
#undef rvRem8     ;divisor
;> u16 / u8 = u8 ;

cpi   rvDig   ,(9-0)+1   ;rvDig is a numerical digit (0-9) & (A-F)
brcs (pc+1)+1       ;-----------+
subi    rvDig   ,(9-A)+1; |
;       <-----------------------+
subi  rvDig   ,-0

push  rvDig   ;Stack it
yms   rvDigCNT

cp    AL, ZERO  ;Repeat until AH:AH gets zero
cpc   AH, ZERO  ;
brne  L_fymt16toSZ_scl
;> string conversion loop

ldi   rvFytt  ,     ;rvFytt = " "
sbrs rvDigits,7       ;When digits indicates zero filtid,
rjmp  (pc+1)+2      ;filler is 0.
neg   rvDigits
ldi   rvFytt  ,0

rjmp (pc+1)+2
st  y+      ,rvFytt   ;
yms rvDigCNT
cp  rvDigCNT  ,rvDigits ;Stack filler
brcs (pc)-3

;< Output stacked digits
;6:
pop   AL    ; <-------+
st    y+    ,AL    ;  |
dec rvDigCNT       ;  |
brne (pc)-3  ; 6b    ;->+
;> Output stacked digits

st  y+        ,ZERO

ret     ;/
#undef rvSign
#undef rvFytt
#undef rvDig
#undef rvBase
#undef rvDigits
#undef rvDigCNT

ENDP fymt16toSZ
Код толком не тестировал, но на парочке примеров с разными системами проблем не было замечено.
Пишите. Если что.
Удачи!
0
0 / 0 / 0
Регистрация: 12.02.2010
Сообщений: 61
08.06.2011, 12:55 10
Цитата Сообщение от ptoop
Есть у кого реализация этих алгоритмов на ассемблере в общем виде, типа библиотеки?
....
Вот есть http://www.atmel.ru/Articles/Atmel13_app2.htm
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
08.06.2011, 14:13 11
(пьёт элексир телепатии) Скорее всего, эти реализации уже есть на вашей машине, по адресу c:\Prokram Files\Atmel\AVR Tools\AvrAssembler\Appnotes\avr204.asm
Там, если посмотреть, ещё много чего интересного есть.
0
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
08.06.2011, 14:33 12
Скорее всего, эти реализации уже есть на вашей машине, по адресу c:\Prokram Files\Atmel\AVR Tools\AvrAssembler\Appnotes\avr204.asm
Требуйте возврата денег у вашего поставщика элексира, моя ubuntu сильно сконфузилась, увидев этот путь в вашем посте :)
---
А серьёзно - я всё понял, спасибо. Буду изучать.
0
0 / 0 / 0
Регистрация: 27.06.2010
Сообщений: 405
08.06.2011, 15:13 13
Цитата Сообщение от Ftymt
Всё, отбой! ltoa((unsykned int)a,String,10) сработало. Почему только не воспользовался этим сразу? :) Или пробывал, но вроде не получил то что надо сразу...
Есть функция utoa - как раз для беззнаковых чисел, лечше её применить.
0
0 / 0 / 0
Регистрация: 12.02.2010
Сообщений: 61
08.06.2011, 16:49 14
Да, точно! Как я ее не заметил.
0
0 / 0 / 0
Регистрация: 12.02.2010
Сообщений: 61
08.06.2011, 16:55 15
Так это я ещё выше ошибся. Хоть и сработало но другую фунцию написал - ltoa вместо itoa. Последняя полюбому неправильно для меня переводит. Действительно utoa то что надо
0
08.06.2011, 16:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2011, 16:55
Помогаю со студенческими работами здесь

Преобразование символов в числа
Помогите пожалуйста написать программу. Дан текст, имеющий вид: d1\pm d2\pm...\pm dn, где...

Преобразование символов в числа
Есть массив символов Нужно преобразовать символы стоящие на нечетных позициях в числа и найти их...

Преобразование символов в числа
Ребят помогите решить задачу плииз!! дан текст, содержащий цифры.Заменить все нечетные цифры...

Преобразование символов в числа
Дан текст, содержащий цифры. Вывести на экран наибольшую цифру. Помогите пожалуйста))

Преобразование символов в числа
Дан текст. Определить, является ли он правильной десятичной записью целого числа.

Преобразование символов в числа
Дан текст, имеющий вид: dl + d2 + ... + dn, где di — цифры. Вычислить записанную в тексте сумму....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru