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

 
 
> Вопрос С
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
Ответов
ViKo
сообщение Jun 30 2010, 09:22
Сообщение #2


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

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



"Шеф, все пропало!..."
По команде *(uint32_t *)(string + 8) = (uint32_t)" 0";
заносится адрес строки, а не сама строка!

На всякий случай, если кто-то заинтересуется, выдаю работающий код.
Код
void  itoad(int number, uint8_t *string)
{
  #define  TETRASPACE  ' ' | ' ' << 8 | ' ' << 16 | ' ' << 24
  #define  TETRATAIL   ' ' | ' ' << 8 | '0' << 16 | '\0'<< 24
  uint8_t  sign;
  *(uint32_t *)(string) = TETRASPACE;
  *(uint32_t *)(string + 4) = TETRASPACE;    
  *(uint32_t *)(string + 8) = TETRATAIL;
  string += 10;
  if (!number) return;
  if (number > 0) sign = '+';
  else {
    number = -number;
    sign = '-';
  }
  do {
    *string-- = number % 10 + '0';
  } while (number /= 10);
  *string = sign;
}


Часть листинга, обратите внимание, стоит команда LDR, а не ADR, как раньше
Код
;;;31       *(uint32_t *)(string) = TETRASPACE;
000002  f04f3220          MOV      r2,#0x20202020
;;;32       *(uint32_t *)(string + 4) = TETRASPACE;    
000006  600a              STR      r2,[r1,#0]
;;;33       *(uint32_t *)(string + 8) = TETRATAIL;
000008  604a              STR      r2,[r1,#4]
00000a  4a3a              LDR      r2,|L1.244|
;;;34       string += 10;
00000c  608a              STR      r2,[r1,#8]
00000e  310a              ADDS     r1,r1,#0xa
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 30 2010, 19:02
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ViKo @ Jun 30 2010, 11:22) *
На всякий случай..

Ну если упорно не хотите нормальное сравнение следать, то вот:
CODE
     59          void  itoad(int number, uint8_t *string)
     60          {
   \                     itoad:
   \   00000000   10B4               PUSH     {R4}
     61            int  sign;
     62            *(int32_t *) string =        0x20202020;
   \   00000002   ....               LDR.N    R2,??DataTable1_1;; 0x20202020
   \   00000004   0A60               STR      R2,[R1, #+0]
     63            *(int32_t *)(string += 4) =  0x20202020;  
   \   00000006   4A60               STR      R2,[R1, #+4]
     64            *(int32_t *)(string += 4) =  0x00302020;
   \   00000008   ....               LDR.N    R2,??DataTable1_2;; 0x302020
   \   0000000A   8A60               STR      R2,[R1, #+8]
     65            string += 2;
   \   0000000C   0A31               ADDS     R1,R1,#+10
     66            if (!number) return;
   \   0000000E   78B1               CBZ.N    R0,??itoad_0
     67            if (number > 0) sign = '+';
   \   00000010   0128               CMP      R0,#+1
   \   00000012   AEBF               ITEE     GE
   \   00000014   2B22               MOVGE    R2,#+43
   \   00000016   4042               RSBLT    R0,R0,#+0
   \   00000018   2D22               MOVLT    R2,#+45
     68            else {
     69              number = -number;
     70              sign = '-';
     71            }
     72            do {
     73              *string-- = number % 10 + '0';
   \                     ??itoad_1:
   \   0000001A   0A23               MOVS     R3,#+10
   \   0000001C   90FBF3F4           SDIV     R4,R0,R3
   \   00000020   03FB1400           MLS      R0,R3,R4,R0
   \   00000024   3030               ADDS     R0,R0,#+48
   \   00000026   01F80109           STRB     R0,[R1], #-1
     74            } while (number /= 10);
   \   0000002A   2000               MOVS     R0,R4
   \   0000002C   F5D1               BNE.N    ??itoad_1
     75            *string = sign;
   \   0000002E   0A70               STRB     R2,[R1, #+0]
     76          }
   \                     ??itoad_0:
   \   00000030   10BC               POP      {R4}
   \   00000032   7047               BX       LR             ;; return


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 30 2010, 20:29
Сообщение #4


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

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



Цитата(zltigo @ Jun 30 2010, 22:02) *
Ну если упорно не хотите нормальное сравнение сделать, то вот:

Вы имеете в виду сравнение кода, или операции сравнения внутри кода? Почему не хочу? Еще как! Листинг я же выдал, там, в файлике keil_temp.txt (он и создается Keil-ом именно в таком виде, с расширением txt). Вот еще раз, после замены типа переменной sign (думал, может в ней дело). С недоумением разглядываю ваш и свой листинги, ничего путного на ум не приходит.
Код
                  itoad PROC
;;;27      ***************************************************************************
****/
;;;28     void  itoad(int number, uint8_t *string)
000000  b510              PUSH     {r4,lr}
;;;29     {
;;;30       #define  TETRASPACE  ' ' | ' ' << 8 | ' ' << 16 | ' ' << 24
;;;31       #define  TETRATAIL   ' ' | ' ' << 8 | '0' << 16 | '\0'<< 24
;;;32     //  uint8_t  sign;
;;;33       int  sign;
;;;34       *(uint32_t *)(string) = TETRASPACE;
000002  f04f3220          MOV      r2,#0x20202020
;;;35       *(uint32_t *)(string + 4) = TETRASPACE;    
000006  600a              STR      r2,[r1,#0]
;;;36       *(uint32_t *)(string + 8) = TETRATAIL;
000008  604a              STR      r2,[r1,#4]
00000a  4a62              LDR      r2,|L1.404|
;;;37       string += 10;
00000c  608a              STR      r2,[r1,#8]
00000e  310a              ADDS     r1,r1,#0xa
;;;38       if (!number) return;
000010  2800              CMP      r0,#0
000012  d011              BEQ      |L1.56|
;;;39       if (number > 0) sign = '+';
000014  dd02              BLE      |L1.28|
000016  f04f042b          MOV      r4,#0x2b
00001a  e001              B        |L1.32|
                  |L1.28|
;;;40       else {
;;;41         number = -number;
00001c  4240              RSBS     r0,r0,#0
;;;42         sign = '-';
00001e  242d              MOVS     r4,#0x2d
                  |L1.32|
;;;43       }
;;;44       do {
;;;45         *string-- = number % 10 + '0';
000020  230a              MOVS     r3,#0xa
                  |L1.34|
000022  4602              MOV      r2,r0
000024  fb90f0f3          SDIV     r0,r0,r3
000028  fb032210          MLS      r2,r3,r0,r2
00002c  3230              ADDS     r2,r2,#0x30
00002e  f8012901          STRB     r2,[r1],#-1
;;;46       } while (number /= 10);
000032  2800              CMP      r0,#0
000034  d1f5              BNE      |L1.34|
;;;47       *string = sign;
000036  700c              STRB     r4,[r1,#0]
                  |L1.56|
;;;48     }
000038  bd10              POP      {r4,pc}
;;;49    
                          ENDP

У вас метка itoad играет какую-то роль? Почему-то у меня запоминается в стеке LR, а у вас нет.
У вас в строке 63 должно быть число 0x20202020 или, как написано?
Сравнение number производится по-разному, но я не вижу в исходниках разницы.
И это LDR.N - там действительно будет по 2 байта? Где-то рядом таблица?
Забавно, что байты в машинных кодах в IAR и Keil написаны по-разному. Где младший, где старший?
Еще один прикол - у меня '+' заносится в регистр 4-байтовой командой (потому что не имеет повторяющейся последовательности?), а '-' 2-байтовой. У вас все 2-байтовые.

Неужели IAR настолько лучше Keil?
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
- - Непомнящий Евгений   В свое время написал такое: CODE /** * "Указ...   Jun 26 2010, 09:16
- - 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
|- - 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:34
Рейтинг@Mail.ru


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