Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: По какой - то причине нет функции ItoA в Keil 5?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Димон Безпарольный
Даже поиском в stdlib.h нет. Только мне так не повезло или это глюк?
x893
Не повезло.
Всем.
Mikl Scherbak
Ну в принципе она и не обязана быть. Она нестандартна. в avr-libc есть, в либе от arm-gcc - есть. А в iar (avr32) - нету.
Jenya7
Код
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;
     }
}
jcxz
Цитата(Jenya7 @ Jul 20 2017, 14:03) *
void ItoA(uint32_t n, char s[])
...

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

p.s. Хотя и так кому-то пойдет.
jcxz
Цитата(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
Jenya7
Цитата(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 вариантов. ваш я даже сравнивать не буду. и так все понятно... ну может быть. может быть.
jcxz
Цитата(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 вариантов. ваш я даже сравнивать не буду. и так все понятно.

Понятно что?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.