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

 
 
 
Reply to this topicStart new topic
> По какой - то причине нет функции ItoA в Keil 5?, AtoI есть, а strrev и itoa нет?
Димон Безпарольн...
сообщение Jun 30 2017, 17:48
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Даже поиском в stdlib.h нет. Только мне так не повезло или это глюк?
Go to the top of the page
 
+Quote Post
x893
сообщение Jun 30 2017, 18:36
Сообщение #2


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Не повезло.
Всем.
Go to the top of the page
 
+Quote Post
Mikl Scherbak
сообщение Jul 3 2017, 14:51
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 22-05-09
Из: Харьков, Украина
Пользователь №: 49 413



Ну в принципе она и не обязана быть. Она нестандартна. в avr-libc есть, в либе от arm-gcc - есть. А в iar (avr32) - нету.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 20 2017, 11:03
Сообщение #4


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Код
void ItoA(uint32_t n, char s[])
{
     uint32_t i = 0;
     uint32_t j;
     char c;

     do { s[i++] = n % 10 + '0'; }
     while ((n /= 10) > 0);
     s[i] = '\0';

     // Reversing
     for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
}
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 20 2017, 12:17
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Jul 20 2017, 14:03) *
void ItoA(uint32_t n, char s[])
...

Хорошо, что не Вы пишете стандартные библиотеки... cool.gif
Go to the top of the page
 
+Quote Post
x893
сообщение Jul 20 2017, 14:12
Сообщение #6


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Тогда называйте не IToA а UIToA
Ну и стиль программирования конечно надо подтянуть.
Книжки почитать.
Код ассемблерный посмотреть.
А то как то неудобно получается.

p.s. Хотя и так кому-то пойдет.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 20 2017, 15:18
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(x893 @ Jul 20 2017, 17:12) *
Ну и стиль программирования конечно надо подтянуть.

ой как надо rolleyes.gif

2 Jenya7: Сравните время выполнения своей функции и нижеприведённой utoa10() (при полной оптимизации). И подумайте почему такое отличие.
CODE
//Преобразует число x в строку в str с основанием 10.
//Возвращает указатель на завершающий 0-ой символ.
char * itoa10(s32 x, char *str)
{
if (x < 0) {
*str++ = '-';
x = -x;
}
return utoa10(x, str);
}

//Преобразует число x в строку в str с основанием 10.
//Возвращает указатель на завершающий 0-ой символ.
char * utoa10(u32 x, char *str)
{
#define D ((B35 + 5) / 10)
u32 i;
char *s1, *s = str;
do {
x = (i = x) * D >> 35;
*s++ = i - x * 10 + '0';
} while (x);
*(s1 = s) = 0;
while ((uint)--s > (uint)str) {
i = *s;
*s = *str;
*str++ = i;
}
return s1;
#undef D
}

ЗЫ: если кто не понял, то B35 это: #define B35 (1ULL << 35)
ЗЫЫ: кто напишет быстрее (без использования ассемблера)? cool.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 20 2017, 15:57
Сообщение #8


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(jcxz @ Jul 20 2017, 21:18) *
ЗЫЫ: кто напишет быстрее (без использования ассемблера)? cool.gif



Код
char* itoa(uint32_t val /*,int base*/)
{
    static char buf[32] = {0};
    int i = 30;
    //for(; val && i; --i, val /= base)
    for(; val && i; --i, val /= 10)
        //buf[i] = "0123456789abcdef"[val % base];
        buf[i] = "0123456789abcdef"[val % 10];

    return &buf[i+1];
}


Цитата(jcxz @ Jul 20 2017, 21:18) *
ой как надо rolleyes.gif
2 Jenya7: Сравните время выполнения своей функции и нижеприведённой utoa10() (при полной оптимизации). И подумайте почему такое отличие.

первый представленный вариант я выбрал после сравнения 5 или 6 вариантов. ваш я даже сравнивать не буду. и так все понятно... ну может быть. может быть.

Сообщение отредактировал Jenya7 - Jul 20 2017, 16:00
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 20 2017, 16:02
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Jul 20 2017, 18:57) *
Код
char* itoa(uint32_t val /*,int base*/)
{
    static char buf[32] = {0};
    int i = 30;
    //for(; val && i; --i, val /= base)
    for(; val && i; --i, val /= 10)
        //buf[i] = "0123456789abcdef"[val % base];
        buf[i] = "0123456789abcdef"[val % 10];

    return &buf[i+1];
}

Жесть какая... Это что??? Зачем цикл до 30? Зачем эта дикая const строка?? wacko.gif
Напоминаю: указанная библиотечная функция возвращает значение в буфере пользователя. Понятно, что если выкинуть эту операцию, то будет быстрее. Но так можно и вообще всё выкинуть.
Также - указанная библиотечная функция (и моя реализация) реентерабельны и потокобезопасны, ваша - нет.

Даже если проигнорировать все эти недостатки, измерим (для входного аргумента == 3000000003) получаем:
мой код == 165 тактов;
ваш == 196 тактов.
Что и неудивительно.

Цитата(Jenya7 @ Jul 20 2017, 18:57) *
первый представленный вариант я выбрал после сравнения 5 или 6 вариантов. ваш я даже сравнивать не буду. и так все понятно.

Понятно что?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 09:30
Рейтинг@Mail.ru


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