Димон Безпарольный 2 30 июня, 2017 Опубликовано 30 июня, 2017 · Жалоба Даже поиском в stdlib.h нет. Только мне так не повезло или это глюк? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 34 30 июня, 2017 Опубликовано 30 июня, 2017 · Жалоба Не повезло. Всем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mikl74 0 3 июля, 2017 Опубликовано 3 июля, 2017 · Жалоба Ну в принципе она и не обязана быть. Она нестандартна. в avr-libc есть, в либе от arm-gcc - есть. А в iar (avr32) - нету. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 20 июля, 2017 Опубликовано 20 июля, 2017 · Жалоба 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 184 20 июля, 2017 Опубликовано 20 июля, 2017 · Жалоба void ItoA(uint32_t n, char s[]) ... Хорошо, что не Вы пишете стандартные библиотеки... B) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 34 20 июля, 2017 Опубликовано 20 июля, 2017 · Жалоба Тогда называйте не IToA а UIToA Ну и стиль программирования конечно надо подтянуть. Книжки почитать. Код ассемблерный посмотреть. А то как то неудобно получается. p.s. Хотя и так кому-то пойдет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 20 июля, 2017 Опубликовано 20 июля, 2017 · Жалоба Ну и стиль программирования конечно надо подтянуть. ой как надо :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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 20 июля, 2017 Опубликовано 20 июля, 2017 (изменено) · Жалоба ЗЫЫ: кто напишет быстрее (без использования ассемблера)? 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 вариантов. ваш я даже сравнивать не буду. и так все понятно... ну может быть. может быть. Изменено 20 июля, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 20 июля, 2017 Опубликовано 20 июля, 2017 · Жалоба 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 строка?? Напоминаю: указанная библиотечная функция возвращает значение в буфере пользователя. Понятно, что если выкинуть эту операцию, то будет быстрее. Но так можно и вообще всё выкинуть. Также - указанная библиотечная функция (и моя реализация) реентерабельны и потокобезопасны, ваша - нет. Даже если проигнорировать все эти недостатки, измерим (для входного аргумента == 3000000003) получаем: мой код == 165 тактов; ваш == 196 тактов. Что и неудивительно. первый представленный вариант я выбрал после сравнения 5 или 6 вариантов. ваш я даже сравнивать не буду. и так все понятно. Понятно что? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться