Перейти к содержанию
    

По какой - то причине нет функции ItoA в Keil 5?

Даже поиском в stdlib.h нет. Только мне так не повезло или это глюк?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну в принципе она и не обязана быть. Она нестандартна. в avr-libc есть, в либе от arm-gcc - есть. А в iar (avr32) - нету.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;
     }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void ItoA(uint32_t n, char s[])

...

Хорошо, что не Вы пишете стандартные библиотеки... B)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда называйте не IToA а UIToA

Ну и стиль программирования конечно надо подтянуть.

Книжки почитать.

Код ассемблерный посмотреть.

А то как то неудобно получается.

 

p.s. Хотя и так кому-то пойдет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и стиль программирования конечно надо подтянуть.

ой как надо :rolleyes:

 

2 Jenya7: Сравните время выполнения своей функции и нижеприведённой utoa10() (при полной оптимизации). И подумайте почему такое отличие.

//Преобразует число 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)

ЗЫЫ: кто напишет быстрее (без использования ассемблера)? B)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ЗЫЫ: кто напишет быстрее (без использования ассемблера)? B)

 

 

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];
}

 

ой как надо :rolleyes:

2 Jenya7: Сравните время выполнения своей функции и нижеприведённой utoa10() (при полной оптимизации). И подумайте почему такое отличие.

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

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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:

Напоминаю: указанная библиотечная функция возвращает значение в буфере пользователя. Понятно, что если выкинуть эту операцию, то будет быстрее. Но так можно и вообще всё выкинуть.

Также - указанная библиотечная функция (и моя реализация) реентерабельны и потокобезопасны, ваша - нет.

 

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

мой код == 165 тактов;

ваш == 196 тактов.

Что и неудивительно.

 

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

Понятно что?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...