Easyelectronics.ru

Электроника для всех
Текущее время: 19 сен 2018, 04:42

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 99 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 02 апр 2018, 13:26 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 479
Вроде-бы допилил универсальную печать - printo("текст", float/ uint(8-32)_t/ int(8-32)_t )
Ближний аналог printf - но урезанный по самые помидоры. Вес 788 байт, по сравнению с printf (почти 20к) - пушинка.
Особо хотелось уйти от синтаксиса команды printf, вообще удалить его - и это удалось. Макрос сам распознаёт тип переменной или константы, её разрядность и печатает в нативном виде. Что само по себе прикольно .:)
Макрос гарантированно будет сбоить в случае неизвестного для системы типа переменной, например переменная принятая от внешней периферии (модем, вайфай и так далее). То-есть после приёма и дешифровки - необходимо поместить переменную для печати в промежуточную переменную - тип которой известен (странно если кто-то поступит иначе).

https://bitbucket.org/AVI-crak/sprint/src

_________________
Потоковая OS


Последний раз редактировалось AVI-crak 05 апр 2018, 20:07, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 02 апр 2018, 16:41 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2507
Откуда: Санкт-Петербург
Забавный подход... Type traits и эмуляция перегрузки функций на Си без крестиков :-). Респект, хотя imho комфортнее будет компилить как C++ и использовать его возможности.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 02 апр 2018, 17:18 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 639
Вывел на печать -123.4, получил -1.234e01, у это -12.34 :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 02 апр 2018, 19:56 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 479
Упс, значится где-то ошибка.
Ещё-бы найти её...
Таки нашёл.
Show

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 03 апр 2018, 08:14 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 479
Тут читать код намного приятнее.
https://bitbucket.org/AVI-crak/sprint/src

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 03 апр 2018, 19:25 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 639
AVI-crak писал(а):
Таки нашёл.

Ищи дальше, вместо 0 выдает 5,87747e-39 :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 03 апр 2018, 20:56 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2237
Опять засада с терминами. :))))) Что такое "слепая печать"? Это как "линейная память", только "слепая печать"? Хм. Почему слепая, а не слепоглухонемая? Может, лучше "простая печать"? Ну правда же, почему "слепая", ёпт??? Че за срань господня со "слепоглухонемыми"?
И почему "печать"? Функции scan/print завсегда именовались функциями ввода-вывода, потому что они завсегда использовались не только для отображения на дисплей, но и для записи в файл или передачи в любой выходной поток.
Без указания параметров - это не форматированный вывод.
А универсальный - это стандартный printf с полным набором всего и вся. Весит дохрена, но это цена универсальности. Есть облегченные small и tiny версии, подходящие гораздо лучше, чем косячный, нестандартный и бесполезный вариант топикстартера. Всё-таки, есть ведь устоявшийся стандарт на формат printf, гарантирующий одинаковое поведение в любых случаях.
Ничего прикольного и универсального в варианте топикстартера я не вижу. Вообще, само слово "универсальный" подразумевает любое решение на любой случай жизни. А в варианте топикстартера - только не отформатированное преобразование числа в строку. А такие ф-ции уже давно написаны. Стандартная ф-ция itoa для целочисленного преобразования есть везде и реализуется очень просто. Осталось только прикрутить ф-цию ftoa для плав.запят., которая тоже уже давно написана. Как бы это стандартные ф-ции.
Вывод float в экспоненциальном формате (да, именно так называется!) 1,23456е+07 - вещь почти никогда не востребованная. Почти всегда интересует отображение вида 123,45 - это называется "естественным форматом числа", или если так угодно, нативным, от native - который можно перевести как "естественный".
Кароче, учите слова и их значения, учитесь правильно выражать мысли!!!

Да, и еще... Уважающий себя программист понимает, что такое отладка написанного кода. И перед тем, как выкладывать или сдавать работу (особенно с громким названием "замена старого на лучшее"), он сначала сам протестирует код ХОТЯБЫ в минимальном объеме! А за такие косяки, когда 0 - не ноль, а -123,4 не -123,4 - принято руки выправлять утюгом.
Походу, AVI-crak - фееричный чудак :))) Либо он сильно иностранец и с трудом подбирает русские слова, либо... эээ... :))) Дак ведь и текст программы составить без косяков - тоже проблема. Дааа уж


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 07:00 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 479
Там оказывается ещё NAN существует, и коды ошибок и бесконечность...
Добавил нуль, и всю эту фигню.
Вложение:
Temp.jpg
Temp.jpg [ 235.75 Кб | Просмотров: 1810 ]

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 07:19 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2237
Чукча не читатель? ЗАЧЕМ написан сей опус? Есть давно написанные стандартные и хорошо работающие ftoa и itoa, это раз. Два - вывод в экспоненциальной форме 1,23456е+07 почти никогда на практике не используется.
"Слепая печать" - это неправильный набор слов. "Простая печать" - более правильно.
Запись вида 1,23456е+07 называется экспоненциальной формой, а не нативной. Нативная, или если правильно, естественная форма - это 123,45. И вот такая запись на практике больше всего и нужна.
В языке Си макросом называется запись, начинающаяся с #define и предназначена для препроцессора. А то, что у топикстартера - это ФУНКЦИИ.
Стандартизованная запись printf с параметрами очень хорошо работает, ибо дает действительно универсальный инструмент, и ничего изобретать не надо. Ее можно изменить по своему вкусу, но оставить общий стандартизованный стиль записи. Это удобно. Но частный случай узкоспециальной ф-ции нельзя называть "универсальной заменой", как пишет топикстартер.

Кароче, очередной выхлоп в воду - набор ошибок и глупостей. Единственная польза для самого AVI-crak в том, что он сам разобрался, как работает преобразование числа в строку, и особенно из float. Еще бы он научился выражаться по-русски и технически грамотно, так еще лучше было бы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 07:56 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 479
BusMaster
Мне просто интересно, как выглядит стандартный универсальный инструмент всея программиста - который не требует описания типа переменной для её корректной печати?
Вот printf требует, и все его младшие собратья требуют, да ещё и весят при этом много. А если не указать тип переменной - то получится глюк.
У меня макрос действительно начинается с #define, и он действительно выполняется перепроцессором, и этот макрос подсовывает в выражение функцию по условию совпадения типа. Нет совпадающих условий - нет функции - минус жирность.
А printf тянет в проект всё своё добро при первом-же его использовании.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 08:24 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2237
Так во-первых, есть готовые облегченные варианты small printf tiny printf, а во-вторых, на их основе можно компоновать свои версии, оставив стандартизованный синтаксис. Это де-факто стандарт. Убрав va_list, уберем переменное число аргументов в ф-ции.
В-третьих, как я уже неоднократно писал, запись в экспоненциальной форме 1,23456е+07 почти нигде не нужна. Вы же не говорите "Взвесьте мне 1,5е+00 килограмм конфет". На практике интересует запись в естественной форме 123,45. Именно такая форма называется естественным, или нативным, если так угодно, видом.
Если бы ты получше изучил исходники printf, ты бы понял, что именно нужно оттуда убрать, и отчего она такая тяжелая. Но зато она - универсальная. Именно универсальная, на все случаи жизни, для любого расклада. Ну, почти.
А то, что написал ты - это узкоспециальная функция, с очень ограниченным видом вывода и с нестандартным синтаксисом. Когда ты сам перейдешь от теоретических тренировок к практике, ты сам поймешь недостатки своего творения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 08:41 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 479
Из ограничения не хватает двойной точности и фиксированной точки.
Двойную точность можно добавить, но наверное будет жирно. А вот фиксированная точка реально нужна. Когда пойму как распознать её тип в автомате - добавлю.
Насчёт печати без буквы е - могу добавить диапазон е-2 до е+6, но при этом упадёт точность. Мне всё-же проще читать степень десятки, чем наблюдать число типа 0,0001.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 08:51 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2237
Ну это лично тебе, это лично твои предпочтения. Напряжение 2.37е+02 В, ток 1.67е-01 А. Такая запись - для "гениев". А простые люди, коих большинство, предпочитают простые формы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 09:20 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 479
Ну ни фига себе. BusMaster - как тебе в голову пришла мысль написать 2.37е+02 В, ток 1.67е-01 А.
Я к тому что это уже не float, и даже не int32_t - это физическая величина. Для неё есть свои единицы измерения, они хоть и кратны (почти везде) тысяче - но имеют иное символьное обозначение. И тот-же printf не имеет поддержки физических единиц измерения, ну буквально - не умеет перебирать автоматом kA, A, mA, µA, nA, pA, fA... Хочется такого представления физики - пиши свою функцию.

А у меня для абстрактных чисел, к тому-же без привязки к типу. И предназначен в первую очередь для отладки, когда int8_t может смениться на int32_t - просто потому что изменился алгоритм.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 11:53 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 639
AVI-crak, как думаешь, что это за число 1,677722e+07? Это максимальное целое которое может вместить float и это не 16777220, а 16777215, т.е. проблема несколько больше, чем просто другое представление чисел, по крайней мере целые должны выводиться без таких огромных погрешностей. Если делать по-нормальному, то нужно добавить отдельную ветку для случая когда экспонента(oftemp2 , в твоем коде) лежит в диапазоне [0..23], там будут все целые и любые другие числа можно будет выводить без E в пределах 8-ми знаков.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 14:44 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2237
Ну, то, что у AVI-crak явные проблемы с логикой и с пониманием терминов, это давно понятно. Черное он называет белым, а белое - розовым.
Ему бы не теоретизировать впустую, а хотя бы термометр с вольтметром сделать... Глядишь, на практических примерах начал бы петрить. Хотя при таких проблемах с логикой это будет "не в коня овес"...
printf - это универсальная ф-ция, в нее легко встроить и эти самые ваши гигаамперы с фемто- и даже аттовольтами. Это делается очень просто!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 16:23 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2507
Откуда: Санкт-Петербург
BusMaster, printf - это адское legacy, которого следует избегать, когда только возможно, а не пытаться расширять. Проблемы даже описывать не буду (хоть по этому форуму поищите)
А register_printf_function в используемых на МК реализациях afaik обычно не поддерживается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 17:08 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2237
Как в анекдоте: "Вы любите кошек? - Нет. - Да вы просто не умеете их готовить!"
А вот чем предложение топикстартера лучше printf, кроме размера?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 17:14 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 2170
BusMaster писал(а):
А вот чем предложение топикстартера лучше printf, кроме размера?

Полагаю, автоматическим определением типов. Впрочем, такие вещи лучше на вариадик шаблонах писать, чем на макросах. И типобезопасность лучше, и пользоваться удобнее - ошибки в выводе ловятся еще на этапе компиляции, а не на этапе исполнения (в отличие от printf).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 17:59 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2507
Откуда: Санкт-Петербург
BusMaster, оно тупее printf со всеми вытекающими (плюсы: меньше размер и не наступишь на грабли из-за несовпадения типа аргумента и типа в шаблоне; минусы - ограниченность возможностей и допущенные ошибки в велосипеде).
Я, как и evsi, предпочитаю подобные вещи на шаблонах, но, как уже говорил, это надо компилить как C++.
В данном случае интересна не сама либа, а подход для реализации type-traits без шаблонов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 20:06 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 479
aamonster писал(а):
минусы - ограниченность возможностей и допущенные ошибки в велосипеде).

На велосипед согласен, на ограниченность - то-же (не всё-же сразу), а вот допущенные ошибки прошу озвучить. Возможно я их просто не вижу, или не хочу видеть. Но соглашаться во всём с BusMaster как-то глупо, слишком много эмоций.
Где искать - https://bitbucket.org/AVI-crak/sprint/src , мне кажется так проще, чем каждый раз выкладывать портянку.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 20:37 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2237
А я не заставляю с собой соглашаться. Но блин, фразы "слепая печать", "нативная форма", "универсальная замена printf" - читать без слез невозможно :)))) Уже объяснял, почему. Глупо - это применять слова, значения которых не знаешь, глупо - путать черное с белым. Вот что глупо!
Допущенные ошибки уже озвучил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 05 апр 2018, 21:49 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 2170
AVI-crak писал(а):
а вот допущенные ошибки прошу озвучить.

Напишите тесты, как делают все современные разработчики.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 06 апр 2018, 11:13 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2507
Откуда: Санкт-Петербург
AVI-crak, я имел в виду ошибку, которую вам указали (и которую вы уже исправили). Совсем не факт, что она была последней.

Действительно напишите юнит-тесты, как сказал evsi. У вас практически идеальная для этого возможность - маленький модуль с простым входом и простым выходом, никакой интерактивности, никакого realtime, по сути нет зависимости от внешнего мира (только вывод символов). Чтоб я так жил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 12 апр 2018, 12:09 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 479
Тесты есть в моём проекте, но беда в том что они одноразовые. Как только решается очередная проблема - тест становится не актуальным. Да и выглядит он достаточно банально - текстовый и тестовый вывод в одной строчке (просто их много).
Пока искал как бороться с фиксированной точкой - нашёл способ более естественного опознания типа переменной, через __typeof__. Кстати прикольная вещь. До этого момента я просто методом научного тыка заставил работать найденный в сети макрос, без осознания так сказать. Для чистого Си необходим макрос __typeof__, хотя сейчас почти всегда солянка, и по этому классический вариант typeof то-же работает.
Ещё-бы время свободное, да набор идей...

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 99 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB