![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
На ЛОРе наткнулся на вопрос и подумал: а ведь действительно в стандартной библиотеке нет функции, которая бы преобразовывала число в строку без излишних манипуляций с жирным sprintf вроде предложенных мною там:
или
В случае с целыми числами можно, конечно, заменить snprintf в первом варианте на постепенное заполнение буфера. В случае же с плавающей точкой и отсутствием ограничения по формату (вроде %8.3f), получается жесть!
Если на компьютере как-то плевать, то на микроконтроллерах приходится выкручиваться через одно место. Благо, на микроконтроллерах нафиг не сдались числа с плавающей запятой — в основном все элементарно на целых или числах с фиксированной запятой (т.е. опять же через целые) выполняется.
Я для вывода целых в терминал каких только макросов не клепал... Самая большая пакость в том, что приходится реверсить строку, т.е. без вспомогательного буфера не обойтись. И получается вот такая бяка:
К чему это? Да к тому, что это ж полная жесть: языку С уже лет и годочков, а элементарные вещи постоянно приходится велосипедить! Я уж молчу, какая жесть творится в области обработки изображений (за недописанным велосипедом далеко ходить не нужно), а уж про робастные методы лучше вообще как о страшном сне забыть (иначе реально можно о снах забыть ☹).
char *itoa(int i){
int L = 2;
char *str = malloc(L);
int rest = snprintf(str, L, "%d", i);
if(rest){
L = rest+1;
str = realloc(str, L);
snprintf(str, L, "%d", i);
}
printf("allocated %d bytes\n", L);
return str;
}
}
или
char *itoa(int i){
char buf[32];
snprintf(buf, 32, "%d", i);
char *str = strdup(buf);
printf("allocated %d bytes\n", strlen(str)+1);
return str;
}
В случае с целыми числами можно, конечно, заменить snprintf в первом варианте на постепенное заполнение буфера. В случае же с плавающей точкой и отсутствием ограничения по формату (вроде %8.3f), получается жесть!
Если на компьютере как-то плевать, то на микроконтроллерах приходится выкручиваться через одно место. Благо, на микроконтроллерах нафиг не сдались числа с плавающей запятой — в основном все элементарно на целых или числах с фиксированной запятой (т.е. опять же через целые) выполняется.
Я для вывода целых в терминал каких только макросов не клепал... Самая большая пакость в том, что приходится реверсить строку, т.е. без вспомогательного буфера не обойтись. И получается вот такая бяка:
void print_int(int32_t N){
uint8_t buf[10], L = 0;
if(N < 0){
usb_send('-');
N = -N;
}
if(N){
while(N){
buf[L++] = N % 10 + '0';
N /= 10;
}
while(L--) usb_send(buf[L]);
}else usb_send('0');
}
К чему это? Да к тому, что это ж полная жесть: языку С уже лет и годочков, а элементарные вещи постоянно приходится велосипедить! Я уж молчу, какая жесть творится в области обработки изображений (за недописанным велосипедом далеко ходить не нужно), а уж про робастные методы лучше вообще как о страшном сне забыть (иначе реально можно о снах забыть ☹).
no subject
Date: 2016-07-12 02:49 pm (UTC)no subject
Date: 2016-07-12 05:37 pm (UTC)Но, поглядев на "код" ардуинщиков на форумах, я уже ничему не удивляюсь: ни жабке/пыхпыху на мелкоконтроллерах, ни хеллоуворлду в UART на 16кБ...