LINUX.ORG.RU
ФорумTalks

Почему?


0

0

Интересно стало, почему в стандарте C есть функции atoi/atol и strtol, но нету противоположных им itoa/ltoa и т.п.?

★★★★

(шутну напоследок)

форкни и будут, где-то нету if fi, case esac...

anonymous
()

Хм, и правда нету. Рад этому: перевод в строку требует работы с буфером памяти, который где-то выделяется, где-то освобождается.. Так вот отутствие этих функций несколько снижает вероятность появления утечек памяти в результате того, что программист просто забудет, что результат функции в конечном итоге надо где-то освобождать на уровне его кода.

anonymous
()
Ответ на: комментарий от octy

> Наверное, потому что они дублировали бы функционал s(n)printf()?

s(n)printf() возвращают длину полученного стринга, itoa() возвращало бы указатель на этот стринг. Зачем -- например, подставить в fopen.

acheron ★★★★
() автор топика
Ответ на: комментарий от anonymous

> перевод в строку требует работы с буфером памяти, который где-то выделяется, где-то освобождается

Нужен всего один буфер, единожды выделяемый при запуске программы (или при первом обращении к функции) и перезаписываемый при повторном вызове функции. Сколько нужно для long? До 15 байт?

acheron ★★★★
() автор топика
Ответ на: комментарий от acheron

> Нужен всего один буфер, единожды выделяемый при запуске программы (или при первом обращении к функции) и перезаписываемый при повторном вызове функции.

Это уж совсем спринтф какой-то получается. Я вообще-то имел в виду старый добрый вариант, где itoa получает на входе переменную и систему счисления, само распределяет буфер и отдаёт вызывающей программе указатель на него.

> Сколько нужно для long? До 15 байт?

Вот-вот, вопросы. А потом кто-то скомпиляет это под 256-разрядный процессор..

anonymous
()
Ответ на: комментарий от anonymous

> Это уж совсем спринтф какой-то получается.

Ну да. Обёртка для sprintf как один из вариантов. А что в нём не так?

>> Сколько нужно для long? До 15 байт?

> Вот-вот, вопросы. А потом кто-то скомпиляет это под 256-разрядный процессор..

2^256<10^78 Думаю, для 256-разрядного компьютера 80 байт -- копейки. Размер таких вещей следует задавать в стандартных библиотеках для каждой архитектуры. Какие проблемы?

acheron ★★★★
() автор топика
Ответ на: комментарий от acheron

Так вроде тебуемый указатель как раз и передаётся первым агрументом sprintf*(), или я не понимаю, зачем ещё это может понадобится?

octy ★★
()
Ответ на: комментарий от anonymous

Ну это не совсем аргумент. В той же *scanf() есть магическая conversion specification 'a' которая выделяет буфер для получаемой строки. Другое дело, что это расширение GNU, и требует самостоятельного вызова free, что повышет вероятность появления утечек памяти ))

octy ★★
()
Ответ на: комментарий от acheron

> и перезаписываемый при повторном вызове функции

> acheron **** (*) (01.07.2008 5:10:56)

т.е. пейсатели многопоточных прог опять получают секас?

berrywizard ★★★★★
()
Ответ на: комментарий от acheron

> Нужен всего один буфер, единожды выделяемый при запуске программы (или при первом обращении к функции) и перезаписываемый при повторном вызове функции.

Да-да, а что там у нас говорится про thread-safe coding style?

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

> что там у нас говорится про thread-safe coding style?

И как сделать эту функцию безопасной? Неужели выделение нового буфера при каждом преобразовании -- единственный выход?

acheron ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.