LINUX.ORG.RU

Аналог шаблонов для языка С.

 ,


0

3

Доброго времени суток!

Столкнулся с проблемой написания структуры с переменной длиной поля. На С++ код пишется элементарно и выглядит как:

template <uint8_t len> struct TPack{
	char Length=len;
	char Item[2];
	char Value[len];
};

Не спорю, что можно бы выделить под Value аж 256 байт, коих с головой хватит под нужную строку, но это требуется для того, чтобы максимально снизить количество передаваемой информации. И не объявлять же под каждую передаваемую связку Item-Value новую структуру нужного размера (Хотя с точки зрения компилятора С++, каждое новое использование шаблона именно это и подразумевает)!

Может, в сях есть уже готовые структуры подобного вида, но мне они не известны.

★★

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

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

ты там объявил себя просветленным гуру, который уже достаточно всего пописал, и теперь уходит в теоретики, и будет спускать лалкам концепты. Лол.

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

Не найдено даже намёка.

достаточно всего пописал

Не найдено даже намёка.

уходит в теоретики

Не найдено даже намёка. Там ни разу не сказано, что я когда-то был «не теоретиком».

будет спускать лалкам концепты

Не найдено даже намёка.

Ржали всем стартапом

Ты, и твоё «дружок», которому ты пытаешься подражать?

Ниужели пацан планктонятина? Тыж говорил, что планктонятиной становятся только те, кто не окончил вуз? Не?

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

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

Планктонятиной становятся те, кто не учился и не развивал скиллы. Учиться и развиваться можно и без вуза, но для этого нужна свежая голова. У тебя же голова забита хламом - больше уже не войдет.

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

Где передача данной структуры в функцию, которая не является логической ошибкой.

А с какого фига это должно быть логической ошибкой? Ну вот такой пример:

typedef struct {uint64_t len; uint8_t arr[5];} mystr; 

inline int getval (mystr a, uint64_t num)
{
  if (num > a.len) return -1;
  return a.arr[num];
}
Что с ним не так?

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

Планктонятиной становятся те, кто не учился и не развивал скиллы.

Как же ты закукарекал, когда я тебя обоссал.

Учиться и развиваться можно и без вуза

Почему-то ты не смог этого даже с вузом.

но для этого нужна свежая голова

Опять же - отмазки от аутистов. Мне вот интересно, почему нонейм говном, которое с вузом в говне - что ты там делаешь - вантузку переустанавливаешь в пту? Рассуждает о том, что и как надо жить.

Да ладно в говне - ты даже 2строчки написать не обосравшись не можешь.

У тебя же голова забита хламом - больше уже не войдет.

И опять же, меня это всегда удивляло. Ну хорошо - хламом, царь говно и прочее.

Ну дак говно так просто победить, так сложно показать и доказать, что ты больше нонейма. Так просто показать то, что ты требуешь от царя. Требуешь код - покажи код и прочее. Почему же только кукареку?

Почему ты не отвечаешь? Почему ты только жрёшь говно и врёшь? Обосрался - не ответил. Дак будь мужиком - хотябы ответь. Тыж там так усердно пастил картинки.

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

А с какого фига это должно быть логической ошибкой? Ну вот такой пример:

Опять же, даже обосраться нормально не можешь.

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

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

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

Тебе задали минимум 2вопроса - ответил на один, и то наврав с условием.

Где передача данной структуры в функцию, которая не является логической ошибкой.
данной

А высирает совершенно другую.

Это же просто убогое говно - как вы на свете живёте? Самим не противно?

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

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

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

О которой ты кукарекал, а кукарекал ты ровно об одной:

У этой хрени

И если такую структуру попробовать передать по значению в функцию, это не будет нормально работать.

Надеюсь, раз память куриная, ты осилишь подняться выше по ветке и прочитать, а что же там за «хрень была» и для какой такой структуры «не будет нормально работать».

Не? Это так сложно?

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

Писалось-то это не для тебя

Прям высеры «по-фрейду» один эпичнее другого. В этом и суть - любой твой высер для публики, а не для меня.

Как всегда обосрался, что ещё следовало от балабола ожидать.

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

Т.е. примером ты не показал. Ты нонейм говном, которое ни одной «штуки» не сделало, хотя аргументировало.

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

омереку ненавидели

Типичный борец-хомячок. Опять типичный «по-фрейду». Методички бывших пропагандистов-хомячков не меняются.

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

Я уже 10раз вам объяснял - мозг он штука такая, и способности - они штуки такие, что если ты мусор - тебя не спасти. Хоть 10вузов, хоть 20. Это такая же мистификация, как и твоя вера в то, что ты хоть на что-то способен.

Вот так и живём - типичная отрыжка колхоз-вуза урюпинска кукарекает о вузах и об «омерэки». Т.е. обыкновенная попытка размыть грань между вузами, и через «вуз» причислить себя к славе нормального вуза.

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

Ну и такая смешная куллстори, что вуз учит думать. В это же так прекрасно и круто верить, что что-то может научить думать. Нет, это так не работает. И ты либо можешь думать, либо нет.

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

Я говорил про жизненно важные скиллы и про английский, это ты как раз перевел все на свои деревенские комплексы - вуз и омереку.

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

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

typedef struct {
  uint64_t len;
  char data[];
} str_t;
Но эту хрень просто так тоже никуда нельзя передать по значению, потому что размер не определен. Да и тип uint64_t великоват. Вот тебе пример для меньшего типа

#include <inttypes.h>
#include <stdio.h>
#include <alloca.h>
#include <string.h>


typedef struct {uint8_t len; uint8_t arr[256];} mystr_256;
typedef struct {uint8_t len; uint8_t arr[];} mystr_0;

typedef union {
     mystr_0 str;
     mystr_256 str256;
} str_union;


inline int getval (mystr_256 a, uint8_t num)
{
  if (num > a.len) return -1;
  return a.arr[num];
}


int main(void)
{
  mystr_0 *a;
  a = (mystr_0*)alloca(10);
  a->len = 9;
  
  {
    char tmp[] = {0,1,2,3,4,5,6,7,8,9};
    memcpy (a->arr, tmp, a->len+1);
  }

  printf("%i %i %i %i\n", getval(((str_union *)a)->str256, 3), getval(((str_union *)a)->str256, 5), getval(((str_union *)a)->str256, 0), getval(((str_union *)a)->str256, 123) );
  return 0;
}

Как можно заметить, чтобы такую хрень выделить на стеке, надо прибегать ко всяким alloca (через VLA кстати тоже можно). И инициализируется оно через одно место. Можно конечно еще понаписать каких-нибудь костылей, чтобы инициализировалось удобнее, например функцию с переменным числом аргументов, в которую передаем размер массива, указатель на выделенную через alloca, malloc, VLA или еще какую-нибудь хрень память и список значений...

Если попробовать сделать такое

typedef struct {uint64_t len; uint8_t arr[UINT64_MAX];} mystr_large;
то гцц напишет error: size of array 'arr' is too large

ибо нефиг

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

Где описание нужности сайзофа для рантайма?

Если нельзя sizeof в рантайме, то и передать такую структуру в функцию по значению никак нельзя.

Где реализации структурок с «работающим» сайзофом в рантайме.

Если не использовать тип uint64_t (который явно избыточен) то можно тупо нагенерить структур с размером массива например от 1 до 256 и через макрос выбирать нужную структуру. И такие структуры можно передавать в функцию по значению. Можно еще сделать через union со структурой максимальной длины как описано тут Аналог шаблонов для языка С. (комментарий)

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от anonymous

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

Только вот в систроке ты 0x00 никак хранить не сможешь, например.

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

Эту хрень просто нельзя никуда по значению передавать, использовать

Алёша, её можно передать, просто это не имеет смысла - это логическая ошибка.

и вообще ее не стоит использовать потому что там массив нулевой длины,

Меня не интеерсует мнение нуля о том, что мне можно, а что нельзя использовать. Аргументы хоть высри.

а такие массивы являются нестандартным расширением GCC. Лучше уж

Такие массивы являются стандартными. Меня так же не интересует твой высер, ибо во-первых я нигде не говорил, что это стандарт.

Тебя уже макнули в говно, сказав, что такая же семантика есть и в стандарте. Этот синтаксис лучше - жрёшь стандартное говно - жри.

Но эту хрень просто так тоже никуда нельзя передать по значению, потому что размер не определен.

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

Да и тип uint64_t великоват. Вот тебе пример для меньшего типа

Меня не интересует мнение нуля. Меня не интересуют днищепримеры от школьников.

Если есть что по-существу - сри, если нет - на голову срать себе не надо. И твои необъективные потуги меня не волнуют.

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

Зачем ты меня чему-то учишь, днище. Ты реально поехавший?

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

Ну и ну, надо прибегать и? К чему ты это высрал? Что из этого следует?

И инициализируется оно через одно место.

Да ты гений. Через какое-же одно место? Поясни.

Можно конечно еще понаписать каких-нибудь костылей, чтобы инициализировалось удобнее, например функцию с переменным числом аргументов, в которую передаем размер массива, указатель на выделенную через alloca, malloc, VLA или еще какую-нибудь хрень память и список значений...

Что ты несёшь, отбитый. Какая нахрен функция? Чего функция? Какой нахрен список значений в рантайме, аутист.

Дебилушка не знает, что можно передать список значений в функцию? Ну да, куллстори. Давай я опять мокну тебя в говно. (char[]){'j', 'r', 'u', '\0'}

Если попробовать сделать такое

И? Чего ты добился своим высером? Что ты им показал/доказал? Какое отношение твой высер имеет к моей структуре?

Иди попробуй себе на голову посрать, а чё? А вдруг?

ибо нефиг

Ты совсем какой-то тупой. Школьник обосрался 10раз, тотальная нулёвая балаболка пытается меня чему-то учить. Совсем отбитый что-ли?

(mystr_0*)alloca(10)

Ба, дак тут адепт вчера из-за парты сбежавший. Яснопонятно.

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

Если нельзя sizeof в рантайме, то и передать такую структуру в функцию по значению никак нельзя.

Чего, балаболка, что ты несёшь? Чего если - его итак нельзя.

Передавать её по значению не имеет смысла - логически, никак. Это не структура - это интерфейс. Хотя с кем я разговариваю.

Если не использовать тип uint64_t (который явно избыточен) то можно тупо нагенерить структур с размером массива например от 1 до 256 и через макрос выбирать нужную структуру.

Меня не интересует мнение нуля. Ага, 256байт хватит всем. Ну нагинерь мне хотябы на 16бит.

Далее, кря-кря - какой жопой ты высрешь выбор типа в рантайме? Ты совсем крякнутый?

Пацаны не просто так про аллоку говорят - у тебя длинна есть ТОЛЬКО В РАНТАЙМЕ. Понимаешь, либо совсем кря-кря?

Можно еще сделать через union со структурой максимальной длины как описано тут

Да ты прям гений. Перечитай заглавную тему.

Это так мило, когда нулёвый школяр рассуждает о чём-то.

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

Только вот в систроке ты 0x00 никак хранить не сможешь, например.

Ахринеть, ниужели? А ещё воду в дуршлаке хранить нельзя, и? Что следует из твоего высера?

Ты сходи, проверься - у тебя явная шизофрения. Ты не можешь как-то связывать утверждения с выводами и темой.

Например - т.е. есть и ещё один пример? Высирай.

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

Ты сходи, проверься - у тебя явная шизофрения.

Царь новое слово узнал.

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

В систроках действительно незачем. А вот в паскалестроках можно

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

Тебе нужен пример данных, которые нельзя в систроке хранить? Да запросто

 char a[] = {0x00, 0x12, 0x34, 0x00, 0x99, 0x88, 0x77};

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

И опять же обосрался. Я вот не могут понять - тебе до сих пор не ясна разница между нами? Иди и дальше сри в левых темах за моей спиной. Зачем ты со мною споришь? Чего добиваешься?

Я говорил про жизненно важные скиллы и про английский

Про скиллы ты не говорил. И про английский тоже. Ты начал кукарекать именно про вуз, а уже после про английский. Про скиллы вообще не кукарекал.

это ты как раз перевел все на свои деревенские комплексы - вуз и омереку.

Про вуз кукарекать начал ты. Про омереку тоже, вернее про цивилизованный мир. Я говорил только слово «пиндосские» и то только для принадлежности, а не как субъект.

Опять же, убогое враньё. Привык что-ли к разговорам среди курочек? Ну дак не фортануло.

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

Тебе нужен пример данных, которые нельзя в систроке хранить? Да запросто

Чего? Какой нахрен пример данных. Ты кукарекал не об данных, а об:

Только вот в систроке ты 0x00 никак хранить не сможешь, например.

0x00 - это значение, т.е. ты кукарекал об значениях. При этом ты кукарекнул слово «например», т.е. это не единственное значение, а пример из множества.

Тебе надо привести иные примеры значений, которые нельзя хранить в си-строке. Вперёд.

Никаких «данных» в твоём высере не было. Зачем ты юлишь, убогий? Яж тебя левой пяткой с говном смешаю - я тебе не сосед по парте, с которыми ты привык кукарекать. Попытайся хотя бы быть человеком. Это единственное, чего ты можешь добиться в этой ситуации.

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

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

Про скиллы ты не говорил.

Ты из-за комплексов пропустил. Перечитай еще раз.

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

То есть все-таки говорил про английский.

Про омереку тоже, вернее про цивилизованный мир. Я говорил только слово «пиндосские» и то только для принадлежности, а не как субъект.

Тебе говорят про английский язык, ты говоришь про «пиндосов» - деревня.

Nuff said.

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

Ну можно и другой пример привести.

long double a[] = {0.000001, 1.0000, 8.000, 3.14159};
char *a1 = (char *)a;
for(size_t i = 0; i < sizeof(a); i++)
  printf("%.2X ", a1[i] & 0xFF);
printf("/n");
Там достаточно много нулей будет

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от SZT

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

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

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

И опять же, в очередной раз мне прийдётся говно смешивать с говном.

Ты из-за комплексов пропустил. Перечитай еще раз.

Вышел Go 1.5 (комментарий) Никаких скиллов, ни намёка на них не найдено.

То есть все-таки говорил про английский.

Мы видим типичный пример подмены понятий от мрази, которая надеется, что оппонирует ей такой же скудоум.

Берём изначальный высер селёдки:

Я говорил про жизненно важные скиллы и про английский, это ты как раз перевел все на свои деревенские комплексы - вуз и омереку.

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

Сельдь обосралась, ибо она не кукарекала про английский до вуза, а именно после - т.е. сельдь обосралась.

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

Тебе говорят про английский язык, ты говоришь про «пиндосов» - деревня.

Опять же враньё. Берём мой высер:

Про вуз кукарекать начал ты. Про омереку тоже, вернее про цивилизованный мир. Я говорил только слово «пиндосские» и то только для принадлежности, а не как субъект.

Сельдь это утверждение никак не опровергло, т.е. они истинно.

Я сказал, что ««пиндосские» и то только для принадлежности», т.е. для идентификации, что никакого к пиндостану, как к субъекту отношения не имеет.

А высером:

это ты как раз перевел все на свои деревенские комплексы - вуз и омереку.

Сельдь предполагает под омерекой именно субъект.

Т.е. сельдь опять же обосралась.

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

Там лонгдаблы, а не нули. Не видишь чтоли?

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

Основываясь на моём утверждение, которые ты опровергнуть так и не смогла, а тихонько согласилась:

0x00 - это значение, т.е. ты кукарекал об значениях. При этом ты кукарекнул слово «например», т.е. это не единственное значение, а пример из множества.

И на изначальном высере:

Только вот в систроке ты 0x00 никак хранить не сможешь, например.

Я делаю вывод, что исходя из единственно возможных типов значений хранимых в си-строке и формата записи примера «0x00» - это именно чары.

Т.е. никакой высер, никаких значений кроме значений чаров, ты, балаболка - высрать не можешь.

А теперь попытайся ещё раз - пока результат один. Рожей в говно.

anonymous
()

M4 (см. autoconf)
</thread> не читал

anonymous
()

Может, в сях есть уже готовые структуры подобного вида, но мне они не известны.

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

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

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