LINUX.ORG.RU

Массив из одного элемента вместо указателя.

 ,


0

2

В работе с libbson постоянно используется конструкция вида type var_name[1]

например тут - http://api.mongodb.org/c/0.4/bson.html

bson b[1];
bson_init( b );
bson_append_int( b, "count", 1001 );
bson_finish( b );
bson_destroy( b );

что не очень очевидно (на мой вкус). Понятно, что используется имя массива как указатель на первый элемент. Но почему не делается это явно?

Например так:

bson b;
bson_init( &b );
bson_append_int( &b, "count", 1001 );
bson_finish( &b );
bson_destroy( &b );

Ну, или если сильно не хочется писать амперсант, то

bson bs;
bson *b = &bs;
bson_init( b );
bson_append_int( b, "count", 1001 );
bson_finish( b );
bson_destroy( b );

Если ли какие-нибудь преимущества записи указателя как массива из одного элемента, и, вообще, блин, зачем так непонятно писать?



Последнее исправление: cetjs2 (всего исправлений: 1)

На вкус и цвет все фдомастеры разные. Разницы нет. Просто кто-то решил заморочиться именно так.

rha
()

Ваш второй вариант ещё менее очевиден.

и, вообще, блин, зачем так непонятно писать

По трем причинам:
1. Чтобы & не ставить
2. Для унификации кода и упрощения рефакторинга. Сейчас объект создаётся в стеке, и тут же с ним ведётся работа. А завтра кто-то захочет создать объект в одной функции, а работу с ним перенести внутрь другой. Тогда ему потребовалось бы перенести код работы в функцию, передать объект по указателю, а затем убрать ручками &. А с массивом ручками убирать & не надо.
3. Это с непривычки непонятно, а после привыкания становится очевидно

Sorcerer ★★★★★
()

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

mikuka
()
Ответ на: комментарий от fluorite

текущая 1.1.8?

Текущая 1.1.9 =)

Я использую последнюю, просто пример нашел в старой. Меня интересует идиома, часто ли так делают?

Кстати, нужно отметить, в доках в последней версии, от этой идиомы отошли. Опять же - почему?

JANB
() автор топика
Ответ на: комментарий от Sorcerer

Ваш второй вариант ещё менее очевиден.

И тем не менее большинство кода который я видел написан именно так.

А вы часто используете эту конструкцию? Ну, массив из одного элемента вместо указателя?

JANB
() автор топика

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

Iron_Bug ★★★★★
()
Ответ на: комментарий от JANB

И тем не менее большинство кода который я видел написан именно так.

Что, специально вводят дополнительную переменную исключительно для того, чтобы амперсанд не писать? Такую переменную-указатель обычно вводят не для этого, а для того, чтобы указатель мог указывать либо на внешний объект, либо (при отсутствии внешнего, например) на локальный.

А вы часто используете эту конструкцию?

Вообще не использую. :)

Sorcerer ★★★★★
()
Ответ на: комментарий от Iron_Bug

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

Я это очень часто встречал именно среди тех кто работает с libbson.

Вот например - люди сами пишут такие конструкции, код ниоткуда не выдран:

http://stackoverflow.com/questions/18706509/use-list-in-mongodb-c-driver?rq=1

http://stackoverflow.com/questions/18719542/sub-object-in-sub-array-in-mongod...

http://stackoverflow.com/questions/18804154/mongo-count-for-sub-documents-in-...

http://stackoverflow.com/questions/23690432/retrieve-all-data-in-collection-i...

И таких очень много

JANB
() автор топика
Ответ на: комментарий от JANB

ну, в первой же ссылке я вижу такой кусок кода:

bson_iterator i[1], sub[i];
это уже явно не просто массивы, а какая-то перегрузка. может, они для единообразия с этой своей перегрузкой и для простоты понимания кода так пишут?

Iron_Bug ★★★★★
()

Но почему не делается это явно?

Чтобы код был похож на Python.

Если ли какие-нибудь преимущества записи указателя как массива из одного элемента

Не надо ставить непонятный и пугающий &.

i-rinat ★★★★★
()
Ответ на: комментарий от JANB

люди сами пишут такие конструкции

Сначала копипастят примеры из документации, а потом копипастят скопипастенное.

i-rinat ★★★★★
()

Это удобно, когда ты объявляешь переменную только ради адреса, чтобы получить спец.поинтер. Например char noname[1] и далее по коду передаешь или set_name(«abc») или set_name(noname). Внутри функций тоже везде проверки на спец.поинтер (где требуется), чтобы отличать «» от noname. Кейс притянут за уши, но думаю суть ясна — само значение noname[0] роли не играет, потому и спрятано за []. Прятать реальное значение наподобие bson — неочевидный тупняк.

anonymous
()
Ответ на: комментарий от JANB

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

Iron_Bug ★★★★★
()

Сразу вспомнился один из способов написания singleton'ов в Яве, когда используется Enum, состоящий из одного элемента.

CARS ★★★★
()

Никогда так не делал. Да, замысел есть, но меня выворачивает от такого «приёма». Есть другой подобный прикол - массив из нуля элементов. Встречал (в коде Asterisk), но сам тоже не использовал.

Krieger_Od ★★
()

Из трех вариантов я за амперсант.

anonymous
()

Из трех вариантов я за амперсант.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.