Easyelectronics.ru

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

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



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

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

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 550
Вроде-бы допилил универсальную печать - 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
Сообщения: 2527
Откуда: Санкт-Петербург
Забавный подход... Type traits и эмуляция перегрузки функций на Си без крестиков :-). Респект, хотя imho комфортнее будет компилить как C++ и использовать его возможности.


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 691
Вывел на печать -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
Сообщения: 550
Упс, значится где-то ошибка.
Ещё-бы найти её...
Таки нашёл.
Show

_________________
Потоковая OS


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

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 550
Тут читать код намного приятнее.
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
Сообщения: 691
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
Сообщения: 2481
Опять засада с терминами. :))))) Что такое "слепая печать"? Это как "линейная память", только "слепая печать"? Хм. Почему слепая, а не слепоглухонемая? Может, лучше "простая печать"? Ну правда же, почему "слепая", ёпт??? Че за срань господня со "слепоглухонемыми"?
И почему "печать"? Функции 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
Сообщения: 550
Там оказывается ещё NAN существует, и коды ошибок и бесконечность...
Добавил нуль, и всю эту фигню.
Вложение:
Temp.jpg
Temp.jpg [ 235.75 Кб | Просмотров: 2249 ]

_________________
Потоковая OS


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2481
Чукча не читатель? ЗАЧЕМ написан сей опус? Есть давно написанные стандартные и хорошо работающие 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
Сообщения: 550
BusMaster
Мне просто интересно, как выглядит стандартный универсальный инструмент всея программиста - который не требует описания типа переменной для её корректной печати?
Вот printf требует, и все его младшие собратья требуют, да ещё и весят при этом много. А если не указать тип переменной - то получится глюк.
У меня макрос действительно начинается с #define, и он действительно выполняется перепроцессором, и этот макрос подсовывает в выражение функцию по условию совпадения типа. Нет совпадающих условий - нет функции - минус жирность.
А printf тянет в проект всё своё добро при первом-же его использовании.

_________________
Потоковая OS


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2481
Так во-первых, есть готовые облегченные варианты 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
Сообщения: 550
Из ограничения не хватает двойной точности и фиксированной точки.
Двойную точность можно добавить, но наверное будет жирно. А вот фиксированная точка реально нужна. Когда пойму как распознать её тип в автомате - добавлю.
Насчёт печати без буквы е - могу добавить диапазон е-2 до е+6, но при этом упадёт точность. Мне всё-же проще читать степень десятки, чем наблюдать число типа 0,0001.

_________________
Потоковая OS


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

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


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

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2527
Откуда: Санкт-Петербург
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
Сообщения: 2481
Как в анекдоте: "Вы любите кошек? - Нет. - Да вы просто не умеете их готовить!"
А вот чем предложение топикстартера лучше printf, кроме размера?


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

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

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


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

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2527
Откуда: Санкт-Петербург
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
Сообщения: 550
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
Сообщения: 2481
А я не заставляю с собой соглашаться. Но блин, фразы "слепая печать", "нативная форма", "универсальная замена printf" - читать без слез невозможно :)))) Уже объяснял, почему. Глупо - это применять слова, значения которых не знаешь, глупо - путать черное с белым. Вот что глупо!
Допущенные ошибки уже озвучил.


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

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

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


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

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

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


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

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

_________________
Потоковая OS


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

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


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

Сейчас этот форум просматривают: KEA


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

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

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