Easyelectronics.ru

Электроника для всех
Текущее время: 20 июл 2018, 09:21

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



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

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

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

Тест остается актуальным. То, что проблема решилась вовсе не значит, что в процессе других изменений он не начнет падать.
AVI-crak писал(а):
Да и выглядит он достаточно банально - текстовый и тестовый вывод в одной строчке (просто их много).

Тест должен быть автоматическим, в том смысле что не глазами надо эти строчки сравнивать, а в самом тесте.


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

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 455
Кхм, затык.
Каким образом можно отличить указатель от переменной? В том смысле что сам GCC всегда знает что в данный момент будет применяться, но нужно знать и мне - для того чтобы выполнить условие перебора действий (разные функции).

В плюсиках с этим делом всё очень просто, но мне нужно на Си.
Вот что-то близкое к этой теме, https://habrahabr.ru/post/352322/. И походу этот код является кроличьей норой, куда может пролезть только один кролик, чуть жирнее или меньше - и дверка не откроется.

_________________
Потоковая OS


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

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1768
AVI-crak писал(а):
Каким образом можно отличить указатель от переменной?

На голом С - никак.


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
Указатель - это такая же переменная, только на 4 беззнаковых байта (в случае 32-битного адреса). Опять проблема с терминами, понятиями и вообще логикой действий. Если невозможно понять, что хотел сказать словами, то стопудово и сама прога так же нелогична.


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

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 415
Что делать если я хочу int число в 16 разрядном виде, или float с заданным количеством знаков после разделителя? Информации о типе здесь будет мало.


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
Вот в том то и беда, что предложенное никак не может быть универсальной заменой. Это лишь частный случай с очень и очень ограниченным применением. До такой степени ограниченным, что практически никогда не будет востребован на практике, из-за очень неудобной и никак не регулируемой формы представления чисел.


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

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 455
BusMaster писал(а):
Опять проблема с терминами, понятиями и вообще логикой действий.

Логика очень проста, определить: является ли аргумент макроса указателем.
BusMaster писал(а):
Что делать если я хочу int число в 16 разрядном виде

Если клиент не прав - мы его ненавидим.
Вам придётся использовать printf как есть. И отказаться от главной идеи макроса printo - автоматического опознавания аргумента печати.
Повторюсь printo предназначен для печати переменных, которые в режиме создания алгоритма могут поменять свой тип. Естественно не с божьей помощью, а исключительно за счёт кривизны рук самого программиста. В случае использования printf - его символьный аргумент придётся переписывать при каждой смене типа переменной. А если это разделяемый алгоритм на несколько десятков каталогов, или просто не помещается в целом виде на экране монитора - то подобная коррекция может достаточно сильно затянуться.
Ярким примером подобного алгоритма может служить почти любой драйвер из каталога hall. Там конечный автомат работает через внешнюю структуру. Описание поведения автомата и сами функции могут быть совершенно в произвольных местах, не поддающихся логике и здравому смыслу.

_________________
Потоковая OS


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

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 455
И снова здравствуйте.
Не, всё работает, печатает как задумывалось, но есть одна неприятность.
GCC ругается на объявление параметров функции без явного указания типа.
void printo( text, value); ///warning: parameter names (without types) in function declaration
Естественно можно просто убрать ошибку - отключив пустую декларацию, которая по сути является дубликатором макроса. Но тогда не слишком удобно применение самой функции. Моё ide не корректно показывает макрос (а он достаточно жирный) - точнее он показывается весь, чего и хотелось избежать.

Пока количество используемой функции printo было небольшим - синева в логе компилятора была ещё терпимой. Но сейчас этих сообщений ну очень много. Нужно что-то делать...

_________________
Потоковая OS


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
Я ж говорил еще в то время, что ерунда это всё, баловство.


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

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1127
Откуда: Китай, Пекин
вывод дебажной информации на печать помогает в примитивных случаях простейших проектов.
с ростом проекта и усложнением структур данных без визуализации этих данных - никак. так устроен человек.
к примеру

The diagram demonstrates connectivity of micropores in a 4mm soil fragment. Nodes represent pores and edges represent interpore throats. Pore sizes range from 10 to 100 microns. Network contains 13,500 nodes and 26,000 edges in a single interconnected domain.

How the diagram was created
The original network was built with specialized software that processes 3D micro-tomography data. The resulting 3D network was saved in TGF format and imported in yEd Graph Editor as a 2D graph. Organic layout with minimal restrictions was used to position the nodes. 'Weight of connected edges' centrality measure was used to set the size of the nodes.
Show


если бы вам насыпали этих цифр в сыром виде в консоль - получился бы мусор.

да, сложные системы требуют построения сбоку отдельного проекта для удобства отладки и визуализации текущего состояния. иногда это могут быть графы, иногда графики.
для отладки своего BlackBox была создана система выгрузки текущего состояния в Excel. Получился микс графики и данных.

без этого инструмента закончить свой проект было бы невозможно.

так что стоит прикладывать усилия именно в этом направлении.


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

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 750
А вы не хотите определить заголовок как
Цитата:
void printo(const char* text, float value);

Это подавит варнинг.

П.С.:
В этой строке у вас undefined behavior:
Цитата:
float_text[ofline++] = float_text[ofline];


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

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 750
По хотелкам.
Требования к базе печати целочисленного аргумент и количеству символов после запятой для плавающего - это предположение о типе, что идет в разрез с изначальной идеей AVI-crak, как я ее понимаю.

Отладочную печать в шестнадцатеричном виде сделать проще простого. Для целых в архитектуре little endian это просто реверс дампа по адресу аргумента на длину его типа. Причем, это может быть универсальный дамп для всех типов, включая float и структуры. Но это должнен быть отдельный макрос, потому как поведение явно специальное.

Количество знаков после запятой - тоже спецмифичная хотелка и тянет на отдельную функцию.


Последний раз редактировалось Mirmik 03 июл 2018, 15:35, всего редактировалось 1 раз.

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

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 750
P.S. Дайте похвастаюсь.... У меня под под с++ тут целая библиотека подобных извращений:
https://github.com/Mirmik/gxx/tree/master/gxx/debug
https://github.com/Mirmik/gxx/blob/mast ... g/dprint.h

Но это, конечно не си... Точнее, си там тоже есть, но автоматического определения типов нет... Определение типов там только в с++.


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

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 750
П.С. В качестве предложения: Количество символов после запятой можно устанавливать специальной глобальной переменной, если, конечно, алгоритм позволяет.
П.С. Алгоритм печати float интересный. Надо будет мне его украсть :).


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

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1768
cheblin писал(а):
вывод дебажной информации на печать помогает в примитивных случаях простейших проектов.

Скорее наоборот. Зачастую только так можно выловить баги в сложном взаимодействии частей программы. И чем сложнее программа, тем бесполезнее все другие средства.
cheblin писал(а):
с ростом проекта и усложнением структур данных без визуализации этих данных - никак. так устроен человек.

Есть куча областей, где визуализация или невозможна или бесполезна. Сюда относятся практически все сколько-нибудь сложные алгоритмы сжатия, хеширования и тому подобное. Если не верите, можете попробовать сделать, например, визуализацию для какого-нибудь blake2b.


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

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1127
Откуда: Китай, Пекин
evsi писал(а):
можете попробовать сделать, например, визуализацию для какого-нибудь blake2b.

открывайте документацию, и прям шпарьте по картинкам в ней.
только blake2b пример не сложного проекта, ценности в визуализации никакой, кроме образовательной


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

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

Все большие проекты вырастают с маленьких программных модулей. Просто оперировать приходится уже не отдельными числами - а блоками данных, в том или ином формате хранения. И вариантов видов этих блоков наверное даже больше чем самих больших программ. По этому визуализация - это всегда часть конкретного проекта. Её нельзя прикрутить насильно куда попало, фигня получится. Примерно так как у вас на картинке.

Так-же, все большие программы вырастают с малых. Но отладка никуда не исчезает из малых блоков. Её проще отключить директивой в шапке, чем вырезать в ручном режиме каждую строчку. (Как у всех.)
Отключённая печать не компилируется, однако по ней проходится сам компилятор (ему надо), и видит все ошибки. И этих однотипных ошибок получается много.

Mirmik писал(а):

В этой строке у вас undefined behavior:
Цитата:
float_text[ofline++] = float_text[ofline];

Угу, ещё-бы вспомнить - чего там требовалось сделать...

Проверенные варианты не пашут. Диагностика отключается глобально, для всего проекта что ниже этих строк.
Цитата:
//#pragma warning (disable: Wimplicit-function-declaration)
//#pragma warning (disable: "-Wimplicit-function-declaration")
//#pragma GCC diagnostic error "-Wuninitialized"
//_Pragma("GCC diagnostic push")
//#pragma GCC diagnostic push
//#pragma GCC diagnostic warning "-w"
void printo( char* text, void value);
//#pragma GCC diagnostic warning "-Wall"
//#pragma GCC diagnostic pop

_________________
Потоковая OS


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

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1768
cheblin писал(а):
открывайте документацию, и прям шпарьте по картинкам в ней.

Спасибо за предложение, но бесполезную работу вы и без меня в состоянии сделать.
cheblin писал(а):
только blake2b пример не сложного проекта, ценности в визуализации никакой, кроме образовательной

Я рад, что вы согласились с тем, что блейка визуализировать бессмысленно. И таких ситуаций много.

P.S. отладочная печать часто применяется для вылавливания, например, race condition. зачастую минимальной печати достаточно, что бы она помогла обнаружить проблему. а вот визуализация бесполезна.


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

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 455
Логично было-бы использовать тип данных без точной типизации, но с явным ограничением по размеру в байтах.
Все типы данных в Си начинаются с признаков логического поведения, что является основным условием для разложения сложных операций на мелкие составляющие в самом компиляторе. И только потом к ним привязывается размер и набор ограничений поведения.
Общие типы с ограничением поведения уже привязывать к аппаратным возможностям того или иного ядра, после чего появляется первый реально применимый тип с реальным размером (в фиксированном количестве бит). На его образе поведения делаются все остальные типы - основное условие не совпадение поведения. И вот уже где-то в самом конце этой фигни появляется int8_t(и все остальные). Тип, который реально используется в пользовательской программе.

Подобный механизм сборки позволяет компилятору собирать самого себя, что само по себе уже удивительно.
Более того, без больших усилий можно сделать байт размером отличным от 8 бит - для ядра имеющего сходный кратный размер регистров. Удивительно -но такие проекты существуют. И они используют тот-же GCC с минимальными переделками. Даже общие программы на таких процессорах выполняются так-же как и на стандартных.

Всё что требуется - использовать определения поведения где-то в начале пути, для сострадания нового типа. (не привлекая внимания санитаров)
Ещё-бы понять как...

_________________
Потоковая OS


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

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


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

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 455
Кхм, с токенами у меня пробел. Я знаю что они существуют, но как их применять пока не совсем ясно.
К счастью гугл походу знает чего мне нужно, хотя раньше на эту страницу я не попадал, странно...
https://habr.com/post/154811/

_________________
Потоковая OS


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

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1127
Откуда: Китай, Пекин
evsi писал(а):
Я рад, что вы согласились с тем, что блейка визуализировать бессмысленно. И таких ситуаций много.

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

а так видно?

Цитата:
P.S. отладочная печать часто применяется для вылавливания, например, race condition. зачастую минимальной печати достаточно, что бы она помогла обнаружить проблему. а вот визуализация бесполезна.

визуализация нужна тогда, (и только тогда) когда данных достаточно много.
когда состояние системы включают в себе большое количество взаимосвязанных переменных.
иначе, усилия потраченные на визуализацию бесполезны.


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

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2470
Откуда: Санкт-Петербург
AVI-crak, применять (по прямому назначению) очень просто:
1. В C++ можно иметь функции с одинаковым именем для разных типов аргументов (внутри они переименовываются - если любопытно, см C++ name mangling). Этого уже достаточно, чтобы без всяких темплейтов реализовать ваш printo руками - как пачку одинаковых функций для разных типов.
2. Написать функцию с темплейтным аргументом - всё равно что написать пачку _одинаковых_ функций для всех типов аргумента, который вы использовали. Это сводит одинаковые функции из пункта 1 к единственной темплейтной.
3. Для конкретных типов аргумента можно руками задать свою реализацию (например, для float использовать другой код), тогда вместо общего кода из темплейта будет использоваться она.

Всё. Просто до омерзения. Сложности начинаются, когда начинают на темплейтах не просто писать обобщённый (для разных типов) код, но всерьёз программировать. А 1-2-3 - проще, чем в той статье.


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

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 100
Mirmik писал(а):
В этой строке у вас undefined behavior:
Цитата:
float_text[ofline++] = float_text[ofline];

Кстати почему? Я бы ожидал, что вся конструкция эквивалента инкременту индекса, а присваивания фактически не происходит.


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

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 455
float_text[ofline++] = float_text[ofline];
А там хитро на самом деле, я то-же не понимаю зачем это написал, и почему это работает.

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

_________________
Потоковая OS


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

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


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

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


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

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

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