Easyelectronics.ru

Электроника для всех
Текущее время: 23 авг 2019, 01:22

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Вернуть из функции примитив который может быть Nullable.
СообщениеДобавлено: 01 мар 2019, 16:56 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 676
ARM это частность. Есть компиляторы ABI и NOABI, для embedded соответственно EABI и NOEABI. ABI передает параметры через стек, NOABI через регистры, причем первые 4 через регистры, остальные все равно через стек. Если же у функции переменное количество параметров, тогда только через стек.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вернуть из функции примитив который может быть Nullable.
СообщениеДобавлено: 20 мар 2019, 20:34 
Старожил
Аватара пользователя

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

попробовал сделать на макросах.
кодогенератор генерирует следующий код макроса
Изображение
который принимает имя переменной, и любой код через переменную if_exist , который будет выполнен если значение существует, и if_null если значения нет.

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

Изображение

таким образом вызов макроса будет выглядеть так
Изображение

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

возможно у кого ещё есть какие идеи как улучшить?

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вернуть из функции примитив который может быть Nullable.
СообщениеДобавлено: 20 мар 2019, 22:26 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 536
По возможности избегаю таких конструкций на макросах, не способствуют читаемости кода. Выразительность повышается, но получается свой маленький язык требующий изучения и внимания, нужен серьезный перевес преимуществ над недостатками, что пойти таким путем. Те кому это нравиться пишут на чем-то другом, не на С.

Как пользователь некоего API, я не стал бы разбираться с этим макросом а вытащил бы из структуры нужные мне данные.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вернуть из функции примитив который может быть Nullable.
СообщениеДобавлено: 21 мар 2019, 05:06 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2287
Откуда: Китай, Пекин
Цитата:
По возможности избегаю таких конструкций на макросах

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

поясняю

обсуждаемые функции это инструмент доступа к данным пакета BlackBox или записи данных в пакет.
некоторые поля в пакете НЕ обязательны (опциональны) это значит что, если их не вписали в пакет - при попытке прочесть из них - вернётся NULL(так было на inline функциях). и это нужно учитывать и в своём коде обрабатывать.
ещё веселее с процессом записи таких полей.
некоторые поля, перед началом записи в них, требуют предварительной инициализации..

не, я конечно расписал в мануале большими буквами что

дорогой пользователь:
прежде чем писать в поле, проверь, что оно было иницализированно для этого.
НО прежде чем инициализировать, проверь что оно не было до этого инициализированно в другом месте и возможно с другими параметрами.

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

а предлагаемые макросы - это уже готовая, чётко выстроенная мозаика, куда нужно просто вписать свой код. при этом понимая все недостатки макросов постарался сделать их максимально простыми для чтения,(не более 15 строк)так чтобы даже не знакомым с API пользователи могли его легко понимать.

Цитата:
я не стал бы разбираться с этим макросом а вытащил бы

И да.
если захочется увидеть "ламповый" код без макросов - нажми на кнопку

особенно красиво выглядит случай когда поле возвращает не единичное значение, а массив
причём ссылка на массив бессмысленна поскольку хранящиеся сырые данные, перед тем как их возвращать часто нужно предварительно слегка обрабатывать. какими бы хитрыми инлайн функции не придумывал лучше макросной реализации ничего не получилось
Изображение
функция extern inline UMAX get_bits(const uint8_t* src, size_t bit, size_t bits) выгребает из байтового массива с заданного бита определённое количество бит и возвращает в виде числа

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

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вернуть из функции примитив который может быть Nullable.
СообщениеДобавлено: 21 мар 2019, 12:01 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2614
Откуда: Санкт-Петербург
Может, вам не надо делать интерфейс к Си? А то получается очень-очень плохо, почти как #define true false.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вернуть из функции примитив который может быть Nullable.
СообщениеДобавлено: 21 мар 2019, 12:30 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2287
Откуда: Китай, Пекин
Цитата:
Может, вам не надо

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

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вернуть из функции примитив который может быть Nullable.
СообщениеДобавлено: 21 мар 2019, 12:41 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2614
Откуда: Санкт-Петербург
Предлагаю: забить на это дело.
(Мой интерес простой: не столкнуться с таким кодом в будущем. Мне, в общем-то, всё равно, забросите вы свой проект или доведёте его до ума, но первое - проще.)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вернуть из функции примитив который может быть Nullable.
СообщениеДобавлено: 21 мар 2019, 13:06 
Старожил
Аватара пользователя

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

_________________
unirail.org


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

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


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

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


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

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

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