Флейм
GameDev.ru / Флейм / Форум / Замена семейства sprintf/sscanf

Замена семейства sprintf/sscanf

Страницы: 1 2 Следующая »
Ghost2Постоялецwww9 фев. 201819:32#0
Очень нужна какая-нибудь легковесная замена sprintf/sscanf со следующими требованиями:
1. Поддержка %d, %u, %i, %c, %s, %p с модификаторами ширины, заполнителя и +/-
2. Поддержка  %f с модификатором точности
3. Мало кода
4. Никаких выделений памяти
4. Должно собираться gcc от 4.9.2 до 6.2.0
+ Показать
thevladПостоялецwww9 фев. 201820:05#1
Ghost2
выдрать из https://www.musl-libc.org/  или если не смущает лицензия из https://github.com/ensc/dietlibc
}:+()___ [Smile]Постоялецwww9 фев. 201820:17#2
Ghost2
> Реально использовалась vsnprintf, но по ее результату нельзя понять, зафейлилась ли она.
> Короче, gcc говно.
Вообще-то %f в printf ожидает double аргумент.
ИМХО, если уж искать замену, то на что-то типобезопасное, что само автоматически выводит типы.
thevladПостоялецwww9 фев. 201820:37#3
}:+()___ [Smile]
> Вообще-то %f в printf ожидает double аргумент.
https://stackoverflow.com/questions/1255775/default-argument-prom… unction-calls
FordPerfectПостоялецwww9 фев. 201822:02#4
Ghost2
stb_printf.h?
Тут вопрос насколько она подходит под требования...
Blew_zcПостоялецwww9 фев. 201822:46#5
Ghost2
Какой-то странный gcc. Ты где такой выкопал?
Какие параметры компиляции?
Ghost2Постоялецwww10 фев. 201810:46#6
thevlad

> выдрать из https://www.musl-libc.org/
Ну, можно попробовать, с первого взгляда вполне выдирабельно. Вообще я вчера попробовал выкинуть линковку с libc/libstdc++, получил кучу ошибок по стандартным функциям, понаписал под них стабов. Но все равно остались функции, которые линкер не находит. Типа _program_init, _program_clean и _exception_handler. Судя по objdump'у, первые две это просто return, а вот _exception_handler непонятно - одна инструкция - бранч по абсолютному адресу, хранящемуся в неком регистре. Да, ещё __cxa_pure_virtual но с ней и так понятно что делать. В принципе все работает за исключением printf/scanf функций, в понедельник попробую заняться корчеванием musl.

}:+()___ [Smile]

> Вообще-то %f в printf ожидает double аргумент.
Даблы на этой платформе эмулируются, в железе нет поддержки. Предупреждения нет, значит все должно быть в порядке.

> если уж искать замену, то на что-то типобезопасное
Да я как-бы не настаиваю на эллипсисах и %. Лишь бы схожего функционала можно было добиться.

FordPerfect

> stb_printf.h?
Спасибо, погляжу.

Blew_zc

> Какой-то странный gcc. Ты где такой выкопал?
GCC то обычный, кросскомпилятор на soft-core процессор Microblaze от Xilinx.

> Какие параметры компиляции?
Да с параметрами все в порядке. Проблема в том, что в самом софте нет ни одного new и malloc, все выделяется статически. Поэтому, когда проект только начинался, на хип было щедро выделено 2048 байт, что на тот момент покрывало все нужды кишок libc/c++. Но в новом gcc видимо что-то поменялось в коде поддержки самих плюсов (вызов конструкторов, деструкторов и т.д.) и она тоже начала кушать память кучи. Вот в примере выше, когда SHOW_BUG равно 0, в результирующем бинарнике, как я понял, вообще нет плюсовой части. А когда добавляется реализация функции accept, этот кусок возникает и начинает при старте жрать память, которой впоследствии не хватает vsnprintf. Почему так происходит - не понятно, потому что в дампе нет следов класса cvar_t, он все это вполне резонно выкидывает.
Ну то есть беда в неявных выделениях памяти в плюсовом рантайме и внутри vsnprintf. Если первого никак не избежать то второго я ну никак не ожидал. Нафига этой функции выделять память совершенно не понятно.

romgermanПостоялецwww10 фев. 201816:01#7
KolyaLПостоялецwww10 фев. 201816:15#8
0iStalkerМодераторwww10 фев. 201819:53#9
KolyaL
> http://fmtlib.net/latest/index.html

Оно память выделяет у себя в кишках (а так да, библиотека хорошая)

Правка: 10 фев. 2018 19:53

9К720Забаненwww11 фев. 20182:12#10
Ghost2
Зачем тебе это, для логов?
@!!exПостоялецwww11 фев. 201813:58#11
Ghost2
> Даблы на этой платформе эмулируются, в железе нет поддержки. Предупреждения
> нет, значит все должно быть в порядке.
Ну так сделай явное приведение к даблу и посмотри, в порядке или нет.
Потому что сейчас у тебя НЕ в порядке.
Dmitry_MilkПостоялецwww11 фев. 201819:54#12
А не проще ли самому навелосипедить аналог потока вывода в буфер фиксированной длины?
То есть, даже не порождаясь от ostream, а просто конструктор, принимающий длину и указатель на буфер, и набор методов-писальщиков, возвращающих ссылку на сам объект, чтоб цепочки строить.
Ghost2Постоялецwww11 фев. 201821:36#13
9К720

> Зачем тебе это, для логов?
Для них в том числе. Но логи в релизе выключаются. Изначально нужно для конфигурации локатора. Есть около 15 самолётов, на которые должен вставать радиолокатор. И каждый со своими протоколами и логикой работы РЛС. Конфигурация хранится в маленьком чипе энергонезависимой памяти, которая является принадлежностью борта. Чтобы можно было поменять локатор на запасной и все работало без необходимости настойки в эксплуатации. Формат конфигурации - ключ/значение. Все настраивается в стиле кваковской консоли через usb2rs. Ну и любые кишки софта и можно выкинуть наружу или поменять через консоль.

@!!ex

> Потому что сейчас у тебя НЕ в порядке.
Да не, все в порядке. Функции с переменным количеством аргументов должны неявно приводить аргументы к нужным типам.

FordPerfectПостоялецwww11 фев. 201823:13#14
Ghost2
Если нужен корректно-округленный printf, так от выделения памяти сложно избавиться.
GCC считает, что ему нужен (юзает www.mpfr.org/ , насколько помню).
Цитата из http://www.netlib.org/fp/dtoa.c :
/*
 * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
 *  memory allocations from a private pool of memory when possible.
 *  When used, the private pool is PRIVATE_MEM bytes long:  2304 bytes,
 *  unless #defined to be a different length.  This default length
 *  suffices to get rid of MALLOC calls except for unusual cases,
 *  such as decimal-to-binary conversion of a very long string of
 *  digits.  The longest string dtoa can return is about 751 bytes
 *  long.  For conversions by strtod of strings of 800 digits and
 *  all dtoa conversions in single-threaded executions with 8-byte
 *  pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte
 *  pointers, PRIVATE_MEM >= 7112 appears adequate.
*/

Возможно недавний http://cseweb.ucsd.edu/~lerner/papers/fp-printing-popl16.pdf можно сделать с константной памятью (хотя их реализация таблицу юзает).

Правка: 11 фев. 2018 23:14

Страницы: 1 2 Следующая »

/ Форум / Флейм / Программирование

2001—2018 © GameDev.ru — Разработка игр