itoa?

Jul. 12th, 2016 11:56 am
eddy_em: (Костерок)
[personal profile] eddy_em
На ЛОРе наткнулся на вопрос и подумал: а ведь действительно в стандартной библиотеке нет функции, которая бы преобразовывала число в строку без излишних манипуляций с жирным sprintf вроде предложенных мною там:

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


К чему это? Да к тому, что это ж полная жесть: языку С уже лет и годочков, а элементарные вещи постоянно приходится велосипедить! Я уж молчу, какая жесть творится в области обработки изображений (за недописанным велосипедом далеко ходить не нужно), а уж про робастные методы лучше вообще как о страшном сне забыть (иначе реально можно о снах забыть ☹).

Date: 2016-07-12 02:49 pm (UTC)
From: [identity profile] mbr.livejournal.com
я свое велосипедил, включая printf. Ибо даже в newlib жрет оно адово.

Date: 2016-07-12 05:37 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Ну, printf на мелкоконтроллерах — это вообще жесть! Особенно если этот printf из stdio...
Но, поглядев на "код" ардуинщиков на форумах, я уже ничему не удивляюсь: ни жабке/пыхпыху на мелкоконтроллерах, ни хеллоуворлду в UART на 16кБ...

May 2025

S M T W T F S
    123
45678910
11121314151617
1819202122 2324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 24th, 2025 05:37 pm
Powered by Dreamwidth Studios