|
Показать число с leading zeros. |
|
|
|
Jan 21 2015, 07:38
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Мне нужно показать число (счетчик) с leading zeros, 8 позиций. То есть вместо 1234 показать 00001234. Делаю так Код void LCD_DisplayUpperCounter(uint32_t number) { char strbuf[9] = ""; ItoA(number, strbuf); char str[9] = "";
if(number<10) strcat(str,"0000000"); else if(number<100) strcat(str,"000000"); else if(number<1000) strcat(str,"00000"); else if(number<10000) strcat(str,"0000"); else if(number<100000) strcat(str,"000"); else if(number<1000000) strcat(str,"00"); else if(number<10000000) strcat(str,"0"); else { //str = ""; }
strcat(str,strbuf); LCD_DisplayUpperText(str); } Все работает. Вопрос можно ли оптимизировать функцию?
Сообщение отредактировал Jenya7 - Jan 21 2015, 07:39
|
|
|
|
|
 |
Ответов
|
Jan 21 2015, 14:47
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Вот еще оптимизация (все время забываю про то, что цикл while, в отличие от do, дает лишнюю команду перехода, а это есть самое зло из всех зол - переходы): CODE void ItoA(char * str, int number) { static const int num_table[9] = {10000000, 1000000,100000,10000,1000,100,10,1,0}; int p=0; char *str_p = str; int i; int tmp; tmp = num_table[p++]; do { i='0'-1; do { i++; } while ( (number-=tmp) >= 0); number += tmp; *str_p++=i; } while (tmp=num_table[p++]); *str_p++=0; }
Листинг 15 инструкций  (а без *str_p++=0; всего 13) CODE _ItoA: ;* --------------------------------------------------------------------------* LDR V9, $C$CON1 ; |11| LDR A4, [V9, #0] ; |11| .dwpsn file "ccs.c",line 13,column 0,is_stmt MOV A3, #47 ; |13| ;* --------------------------------------------------------------------------* ;* BEGIN LOOP ||$C$L1|| ;* ;* Loop source line : 13 ;* Loop closing brace source line : 13 ;* Known Minimum Trip Count : 1 ;* Known Maximum Trip Count : 4294967295 ;* Known Max Trip Count Factor : 1 ;* --------------------------------------------------------------------------* ||$C$L1||: $C$DW$L$_ItoA$2$B: SUBS A2, A2, A4 ; |13| ADD A3, A3, #1 ; |13| BPL ||$C$L1|| ; |13| ; BRANCHCC OCCURS {||$C$L1||} ; |13| $C$DW$L$_ItoA$2$E: ;* --------------------------------------------------------------------------* $C$DW$L$_ItoA$3$B: ADD A2, A4, A2 ; |14| LDR A4, [V9, #4]! ; |16| STRB A3, [A1], #1 ; |15| CMP A4, #0 ; |16| MOVNE A3, #47 ; |13| BNE ||$C$L1|| ; |16| ; BRANCHCC OCCURS {||$C$L1||} ; |16| $C$DW$L$_ItoA$3$E: ;* --------------------------------------------------------------------------* MOV V9, #0 ; |18| STRB V9, [A1, #0] ; |18| .dwpsn file "ccs.c",line 20,column 1,is_stmt $C$DW$4 .dwtag DW_TAG_TI_branch .dwattr $C$DW$4, DW_AT_low_pc(0x00) .dwattr $C$DW$4, DW_AT_TI_return BX LR
так что, разбирайтесь со своим кривым компилятором, из какого пальца он там инструкции высасывает.
|
|
|
|
Сообщений в этой теме
Jenya7 Показать число с leading zeros. Jan 21 2015, 07:38 SM 1) sprintf(strbuf,"%08u",number); Притащ... Jan 21 2015, 07:43 Jenya7 Цитата(SM @ Jan 21 2015, 13:43) 1) sprint... Jan 21 2015, 08:40 SM Еще, если Ваш CPU умеет быстро вычислять экспонент... Jan 21 2015, 08:45 ViKo Цитата(SM @ Jan 21 2015, 11:45) Еще, дума... Jan 21 2015, 09:24  SM Цитата(ViKo @ Jan 21 2015, 12:24) numb % ... Jan 21 2015, 09:41   ViKo Цитата(SM @ Jan 21 2015, 12:41) Ой. А это... Jan 21 2015, 09:47    SM Цитата(ViKo @ Jan 21 2015, 12:47) Нема, з... Jan 21 2015, 09:51     andrew_b Цитата(SM @ Jan 21 2015, 12:51) Да, Вы пр... Jan 21 2015, 11:01    Jenya7 я пользуюсь этим
Код
void Reverse(char s... Jan 21 2015, 10:00     CrimsonPig Цитата(Jenya7 @ Jan 21 2015, 10:00) я пол... Jan 21 2015, 11:37      Jenya7 Цитата(CrimsonPig @ Jan 21 2015, 17:37) Л... Jan 21 2015, 12:03       CrimsonPig Цитата(Jenya7 @ Jan 21 2015, 12:03) так н... Jan 21 2015, 12:16       SM Цитата(Jenya7 @ Jan 21 2015, 15:03) так н... Jan 21 2015, 12:37        CrimsonPig Цитата(SM @ Jan 21 2015, 12:17) То, что я... Jan 21 2015, 12:39         SM Цитата(CrimsonPig @ Jan 21 2015, 15:39) ... Jan 21 2015, 12:47          CrimsonPig Цитата(SM @ Jan 21 2015, 12:47) А если ну... Jan 21 2015, 12:54           SM Цитата(CrimsonPig @ Jan 21 2015, 15:54) т... Jan 21 2015, 12:57            CrimsonPig Цитата(SM @ Jan 21 2015, 12:57) Но это не... Jan 21 2015, 13:02          Jenya7 Цитата(SM @ Jan 21 2015, 18:47) Это пусть... Jan 21 2015, 13:00           SM Цитата(Jenya7 @ Jan 21 2015, 16:00) надо ... Jan 21 2015, 13:05            Jenya7 Цитата(SM @ Jan 21 2015, 19:05) Если же В... Jan 21 2015, 13:24             SM Цитата(Jenya7 @ Jan 21 2015, 16:24) и с ... Jan 21 2015, 13:28              Jenya7 Цитата(SM @ Jan 21 2015, 19:28) Чего там ... Jan 21 2015, 14:18               CrimsonPig Цитата(Jenya7 @ Jan 21 2015, 14:18) в при... Jan 21 2015, 14:36                SM Цитата(CrimsonPig @ Jan 21 2015, 17:36) c... Jan 21 2015, 14:40                 CrimsonPig Цитата(SM @ Jan 21 2015, 14:40) не const,... Jan 21 2015, 14:53                  SM RE: Показать число с leading zeros. Jan 21 2015, 15:02                   CrimsonPig Цитата(SM @ Jan 21 2015, 15:02) Потому, ч... Jan 21 2015, 15:09                    SM Цитата(CrimsonPig @ Jan 21 2015, 18:09) К... Jan 21 2015, 15:19                  Jenya7 Цитата(CrimsonPig @ Jan 21 2015, 20:53) Н... Jan 21 2015, 15:46       AHTOXA Цитата(Jenya7 @ Jan 21 2015, 17:03) так н... Jan 21 2015, 13:43        Jenya7 Цитата(AHTOXA @ Jan 21 2015, 19:43) Выбир... Jan 21 2015, 14:45      andrew_b Цитата(CrimsonPig @ Jan 21 2015, 14:37) 2... Jan 21 2015, 13:39 Jenya7 Цитата(SM @ Jan 21 2015, 14:45) Еще, если... Jan 21 2015, 12:45 Jenya7 интересно. спасибо. надо проверить. Jan 21 2015, 09:11 SM Извращение какое... Сначала сделать строку с напра... Jan 21 2015, 10:07 Jenya7 Цитата(SM @ Jan 21 2015, 16:07) Извращени... Jan 21 2015, 10:48 SM Что-то у вас косяк с уровнем оптимизации. Это пише... Jan 21 2015, 14:21 Jenya7 Цитата(SM @ Jan 21 2015, 20:21) Что-то у ... Jan 21 2015, 14:50
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|