Easyelectronics.ru

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

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



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

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

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2277
Откуда: Китай, Пекин
Необходимо из функции вернуть примитив int32_t / uint8_t / float ....

однако проблема в том, значение может быть пустым - условно NULL.

нужно сделать так чтобы проблема присутствия пустого значения была очевидна пользователю кода библиотеки. чтобы максимально усложнить возможность отмахнуться от проверки того что результат НЕ пустой.
рассматриваю несколько вариантов.
Код:
#include <stdint.h>
#include <stdbool.h>

typedef struct
{
   const uint16_t id;
}                  Cursor;

int32_t test(Cursor* data, bool* not_null)
{
   *not_null = true;
   return 0;
}

bool test2(Cursor* data, int32_t* dst)
{
   *dst = 77;
   return true;
}

typedef struct
{
   bool is_not_null;
   int32_t value;
}                  nullable_int32;

nullable_int32  test3(Cursor* data)
{
   nullable_int32 ret;
   ret.is_not_null = true;
   return ret;
}


void main()
{
   Cursor cur;
   bool   not_null;

   int    ee = test(&cur, &not_null);
   if (not_null)
   {
      //using value
   }
   
   int dd;
   if (test2(&cur, &dd))
   {
      //using value
   }

   nullable_int32 ss = test3(&cur);
   if(ss.is_not_null)
   {
      //using value
   }
}


playground

кому какой вариант больше нравится. можно сделать лучше?

_________________
unirail.org


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

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3264
да как угодно, в любом случае от проверки можно отмахнуться.
передавать по ссылке/указателю, а возвращать код ошибки наверное лучше, так наверное сложнее от проверки отмахнуться,

а ещё можно возвращать указатель, нулевой если значения нет, но лучше не надо.

Код:
auto test4(){  return std::shared_ptr<int> (some_condition ?  new int(42) : nullptr); }
...
if (auto a = test4()) printf("%d", *a);


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

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 651
Откуда: Германия
Второй вариант - классика в C. Можно еще сдобрить __attribute__ ((warn_unused_result)).

Вариант 3 интересен в более мощных языках, когда прямой доступ к value можно закрыть.


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

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 674
Доброго времени суток !

Я так понял - вам нужно вернуть значение которое может быть 0 и при этом вы хотите обозначить ошибку. То есть возврат 0 не обозначает ошибку. Я бы делал так:
Код:
uint32_t *myfunc(Cursor *data) {

        // обработка
        uint32_t *ret = NULL;
        if (!error) {ret = malloc(sizeof(uint32_t)); *ret = resultat;}
        return(ret);
}
// использование
uint32_t *res = myfunc(...);
if (res) {
// ошибки не было,
// обрабатываем результат
free(res);
} else {
// была ошибка
// результата нет
}

Если нет желания связываться с malloc можно просто в функции объявить переменную static и скидывать на нее адрес.


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3511
Но это же самый обычный Си. А где же гиперактуальный хРуст?
NULL - традиционно описан в виде
#define NULL ((void *)0)
или
#define NULL 0


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

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

нет. мне нужно заставить пользователя обработать случай когда значения нет. NULL НЕ ПРОСТО НОЛЬ ноль - это значение. а нужно обработать отсутствие значения.

Цитата:
А где же гиперактуальный

да вот жеж он, положила(с)

именно углубившись в Rust я начал задумываться о таких "мелочах" как более предсказуемое API

я написал уже версию кодо-генерации BlackBox на Rust и сгенерированные API и код тестирования сгенерированного кода уже компилируются.

настало время отладки...

однако решил пересмотреть Сишный API на предмет того как сделать получше, максимально близко к идеалу Rust в котором есть Option

кстати ещё одну тему утянул из Rust.... тотально на всех языках в BlackBox перехожу на использования UTF8. не будет больше однобайтовых и двубайтовых строк...

сам склоняюсь к варианту 3 уже даже код предварительно накидал

Код:
#define NULLABLE(T) typedef struct { bool is_null; T##_t value; } nullable_##T;
NULLABLE(uint8)

NULLABLE(int8)

NULLABLE(uint16)

NULLABLE(int16)

NULLABLE(uint32)

NULLABLE(int32)

typedef struct
{
   bool  is_null;
   float value;
}         nullable_float;

#ifdef   UINT64_MAX
NULLABLE(uint64)

NULLABLE(int64)

typedef struct
{
   bool   is_null;
   double value;
}          nullable_double;
#endif

_________________
unirail.org


Последний раз редактировалось cheblin 28 фев 2019, 19:42, всего редактировалось 1 раз.

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

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 674
ну так я вам и привел пример - возврат адреса NULL - нет результата, иначе адрес где лежит результат.


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

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


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

Цитата:
да как угодно, в любом случае от проверки можно отмахнуться.

можно. но хочется дать шанс тем - кто заблуждается по не знанию

_________________
unirail.org


Последний раз редактировалось cheblin 28 фев 2019, 19:49, всего редактировалось 1 раз.

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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3511
Цитата:
да вот жеж он, положила(с)

Ой, та то просто Си, с пользовательскими дефайнами. Ты просто не знаком с классическим Си и обычные переопределения и надстроки воспринимаешь как новый язык.
А что, хРуст не умеет работать с (void*)0? Ну это значит хня какаято.


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

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2277
Откуда: Китай, Пекин
Ой, та Си, это просто asm - но для графомана...

ясен пень Rust - собрание лучших практик из разных языков и это многолетний опыт в бетоне...
Цитата:
не умеет работать с (void*)0? Ну это значит хня какаято

хня какаято это когда кроме как (void*)0 ничего нет.

если в Rust хочется странного... на, стреляй в ногу

_________________
unirail.org


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

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 173
cheblin писал(а):
ясен пень Rust - собрание лучших практик из разных языков и это многолетний опыт в бетоне...

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

ПС: И да, от exception-а пользователи чудо-библиотеки не отмахнутся.


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

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

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

ПС: И да, от exception-а пользователи чудо-библиотеки не отмахнутся.

отличное конспироложество. шапочка из фольги не жмёт?
я ни слова не сказал про Rust, пора начать подозревать BusMaster это мой ботик такой, для разжигания страстей.

я улучшаю, пересматриваю свой Сишный код. и вопрос только в этом. точка.
меня интересует мнение пользователей о вариантах.

_________________
unirail.org


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

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 674
cheblin писал(а):
спасибо. видел.
я не стал даже предлагать обсуждать этот вариант ибо - это реально жуткая жуть.
в этом коде одни минусы и в смысле надежности и в смысле производительности. и в смысле дефрагментации

Если можно - по подробней. Чего там жуткого ? В чем проблема с надежностью ? (NULL не NULL) бинарный результат, чего может быть надежней ? Производительность максимально возможная в принципе - возвращаем адрес в регистре. Или вы думаете что ваша структура будет быстрей из стека выкавыриваться ? Дефрагментация зависит не от компилятора, а от программиста. Многие функции при возврате создают новую аллокацию памяти, которую после испльзования нужно освобождать (к примеру функции работы со строками). И если автор программы этого делать не умеет - программирование это не его! И ваша реализация ему не поможет, тут как говорится - медицина бессильна !


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

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

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

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

_________________
unirail.org


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3511
А здесь мы наблюдаем, как Чоблин встрял с простейшей фигней проверки на 0 :))))))
Интересно, на сколько страниц разрастется тема, чтобы он понял, что есть ноль в его жизни :)))
Цитата:
очистка памяти - не моё дело.

Правильно. Программирование - вообще не твоё дело :)))
И да, память выделяется и освобождается автоматически только в оболочках, которой и является хРуст.
хРуст - это не отдельный язык программирования. Это оболочка, надстройка переопределений классического Си.
Чоблин просто никогда не видел Си вживую :))


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

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 674
cheblin писал(а):
на Си, при написании API я придерживаюсь такого принципа. если я не выделял явно память на полученную из функции ссылку, очистка памяти - не моё дело.

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

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

Если не хочется связываться с аллокацией - опишите внутри функции переменную статик. Согласно calling convention - структуры в регистрах не передаются, по этому, только стек, без вариантов. В принципе ваш вариант 2 (возврат bool) вполне жизнеспособен. Для возврата структур всегда передается адрес, просто если вы не указали сами память для передачи, то она будет выделена в стеке скрыто, куда и будет скопирована результирующая структура. Почитайте на досуге:[url]https://ru.stackoverflow.com/questions/516993/Передача-структур-в-функции-и-возврат-структур-из-функций[/url]


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

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 173
cheblin писал(а):
отличное конспироложество. шапочка из фольги не жмёт? я ни слова не сказал про Rust,

Ха, ни слова не сказали. Да благодаря вашему тут евангелизму добрый десяток пациентов хотя-бы по диагонали глянул-ознакомился с этой новинкой компьютерной мысли. :-D


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

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

_________________
unirail.org


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

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2277
Откуда: Китай, Пекин
не всё так однозначно.
Returning structures from functions through registers
how c compiler treats a struct return value from a function, in ASM

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

_________________
unirail.org


Последний раз редактировалось cheblin 28 фев 2019, 21:44, всего редактировалось 2 раз(а).

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

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2629
в swift такой тип данных называется optional. очевидно, удобное изобретение?


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3511
Чоблин таким способом предпринял очередную попытку прорекламировать никому не нужный хРуст. Ибо другие методы уже исчерпали себя.


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

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2277
Откуда: Китай, Пекин
Цитата:
очевидно, удобное изобретение?

несомненно. помимо этого в Rust есть ещё Result и тд
а при желании никто не запрещает наклепать ещё

Цитата:
таким способом предпринял очередную

все уже догадались, что ты мой ботик. только после твоего высера тема переключилась в Rust vs НЕ Rust

_________________
unirail.org


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

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 674
cheblin писал(а):
не всё так однозначно.
Returning structures from functions through registers
how c compiler treats a struct return value from a function, in ASM

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

Никаких "скорее всего" не произойдет. В вызовах все четко регламентировано. В приведенном вами примере принудительно описывается, что данная функция будет работать именно так (возвращать структуру в регистрах). Но и использование данной функции из вне то же нужно правильно описать. Что данное правило касаемо именно этой функции.


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

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

_________________
unirail.org


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

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 651
Откуда: Германия
void1509 писал(а):
Никаких "скорее всего" не произойдет. В вызовах все четко регламентировано.


О какой архитектуре речь? Для ARM'а, к примеру, в спецификации вообще ни слова про стек.


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

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


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

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


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

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

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