Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Да не, можно и без генератора что-то вменяемое накобенировать из примитивных парсеров. Там единственно класс грамматик поуже чем у бизона и надо очень аккуратно с рекурсией.
генераторы гавно.. все нормальные генераторы пишут ручками (по схеме но ручками). я как не опытный пытался писать на (каком то генераторе) в конечном итоге это говно парсило пол дня простой текст
> Тот же бизон умеет и вперед немножко подглядывать для разрешения конфликта и форкать стейт в неоднозначных точках и смотреть какой выживет.
Это как в крестоговне с "жизнеспособностью" при вызове правильной функции https://govnokod.ru/27443#comment630395 ?
Можно считать баллы у двух или более стейтов по каким-то критерям, и выживает вореант, набравший максимум баллов.
А если сделать хуйню, где правила определения коэффициента жизнеспособности вореанта парсинга хуйни можно будет описывать на тьюринг-полном языке в виде специальной аннотации, парсинг может никогда не завершиться
Желательно чтобы эти правила можно было писать в самом разбираемом тексте. Причём в любом месте, даже в конце, чтобы парсить было интереснее. И влиять они должны даже на парсинг самих себя.
Можно описать в аннотациях к фразе "сделать заебись" какую-то формальную спецификацию. И парсер должен будет так разобрать эту фразу, чтобы получился код, удовлетворяющий спеке.
Скажи вот мне, как рубящий в ремонте человек. Если стояк батареи это общедомовое имущество, а отводка от него (включая кран) имущество мое, и УК забыла поставить перемычку, так что когда я выключаю батарею -- я блокирую стояк, и соседи бузят, я могу же их посылать в УК? Кран -- моя собствненость, и я не обязан его открывать, верно?
Нельзя взять и сократить "сварщик не доделал работу и мне жарко" + "я закрыл кран и оставил соседей без тепла" до "сварщик не доделал работу и оставил соседей без тепла".
Есть же какие-то законы, говорящие что я могу и не могу делать.
Я не могу портить общедомовое имущество
Я могу делать что угодно со своим имуществом
Кран -- мое имущество
Если электрик сойдет с ума, и заземление из моей квартиры с этажа проведет к батарее соседки, и ее ебнет, буду ли я виноват в том, что включил в розетку стиралку с металлическим корпусом?
Первый раз наверное простят, так же как если ты откроешь кран когда соседи пожалуются.
Но вот если ты знал о проблеме и умышленно не открываешь кран или продолжаешь юзать эту машинку несмотря на просьбы соседей -- то ты пидор и будешь за это отвечать. Как и накосячивший электрик/сантехник.
Ну как сказать... вроде бы по закону ты не можешь приварить радиатор слишком большой площади, т.к. это создаст дизбаланс соседям. Скорее всего блокировка потока в те же нормы прописана.
У радиаторов есть мощность. В ваттах. Есть нормы по количеству необходимого тепла. В килокалориях в час. Считается для каждого здания по своему. Если одно сильно превышает другое, другим будет холодно, и когда пидара вычислят, ему пересчитают коммуналку на фактически потреблённое тепло.
Даже опуская вопрос, кому принадлежит кран, всю ответственность за его использование будешь нести ты.
Весь стояк остался без тепла? УК придётся вернуть деньги за некачественно оказанную услугу → УК стребует эти деньги с тебя. Если УК оштрафуют, они и сумму штрафа с тебя могут истребовать. Из-за резко закрытого крана выбило стык на чердаке и 10 квартир оказались залиты кипятком? Плати. Да, он был проржавевшим насквозь, но «система успешно прошла испытания перед началом отопительного сезона, экспертиза установила причиной неквалифицированные действия guest6, спровоцировавшие гидроудар, поднявший давление в отдельных участках отопительной системы намного выше нормальных эксплуатационных величин». Чей-то попугайчик замёрз? Надеюсь, он не был очень дорогим.
З.Ы. Я помню у нас в доме тоже как-то завёлся пидор с последовательно подключенным краном, которому было жарко зимой... Всем стояком его искали чтобы выебать.
Вот этот момент мне непонятен. Кран мое имущество, стояк общедомовое.
Общедомовое я не имею права трогать, а кран имею: я его ставил за свои деньги, я за него отвечаю, если он протечет -- то я буду платить денег.
По-моему соседи должны выебать УК, и УК должны послать мне сантхника, которому я обязан предоставить доступ к стояку (как к общедомовому имуществу) и он должен поставить туда байпасс
Ко мне еще не пришла управляйка, ко мне соседка приходила.
Я не против открыть кран на время пока они ставят байпасс, но мне совершенно не понятно почему я обязан постоянно сидеть с этим краном, если это косяк управляйки?
У меня просто горит жопа от того, что если кран протекает, то это ТВОЙ кран и ты должен нижним соседям полтора ляма
Если ты хочешь его поменять, то это ТВОЙ кран и ты платишь сантехнику за его замену
А если ты хочешь его закрыть, то сразу это общий кран, и делать этого нельзя.
// нахуя мне тут "CHAR_BIT*sizeof(unsigned long long)" ?
const size_t bytes_allocated =
1ULL <<
(
CHAR_BIT*sizeof(unsigned long long)-
__builtin_clzll(sizeof(stack)+len*sizeof(node_elm))
);
_builtin_clzll() должна посчитать лидирующие нулевые биты в числе(для типа unsigned long long - см. https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html ), а мне тут нужно получить позицию последнего единичного бита, если считать от младшего к старшему. Например, если есть число, которое в двоичном представлении имеет вид
0b00001011
то мне надо вернуть 4 т.к. в четвертой позиции этот бит находится
0b00001011
4321 // да, тут нумерация не с нуля, а с единицы
Кстати, а что там в std::vector, там размер хуйни и сами данные хранятся одним куском, как в этом примере с "flexible array member" или там типа структура, в которой количество элементов и потом указатель на хуйню с этими самыми элементами?
Я вот попробовал посмотреть в libstdc++ из GCC, там какая-то ебаная непонятная хуйня написана. https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/stl_vector.h
Но непохоже, чтобы оно в эту "struct _Vector_base" что-то непосредственно встраивало
template <typename T>
struct array {
size_t sz;
T array_data[]; // flexible array member
// данные рядом с самим размером, не нужно лишних разыменований
};
Оффсет относительно начала структуры (т.е. адрес, где начинаются непосредственно данніе) там известен на этапе компиляции, так что он не влияет. А вот лишнее разыменования влиять может.
Ну допустим я куда-то передаю указатель на первую структуру (где T *array_ptr;) - чтобы добраться до самих данных, мне надо из самой структуры достать указатель arr_ptr и потом его разыменовывать уже.
А если я передаю указатель на вторую структуру (где T array_data[]; // flexible array member ) то надо лишь добавить к указателю на такую структуру размер size_t, и вот уже можно читать данные
Это нечестное сравнение. Первую структуру ты передаешь по указателю чтобы её можно было ресайзить и т.п. Для r/o её и по значению можно передать. Ну и встраивается она напрямую.
Вторая структура по одному указателю r/o. Для ресайза надо двойную индирекцию. И встраивается только по указателю.
Да, чтобы вторую ресайзить, нужен указатель на указатель на такую структуру. Или возвращать новый указатель после ресайза через return как вариант.
А первая структура может сама быть выделена на стеке например, и уже указатель будет на хип указывать. И можно сделать массив таких структур т.к. размер самой структуры там фиксирован. А для второй структуры только массив из указателей получится сделать
Ну хорошо, а допустим если мне нужны константные (т.е. неизменяемые в рантайме) строки из байт, как более адекватная замена нуль-терминированным говнострокам сишки, но чтобы без Шлемазла Шлемиэля т.е. чтоб не нужно было прочитывать строку до конца для узнавания размера строки? И для такой хуйни понаделать структурок
Можно например сделать варианты
И для такой хуеты понаделать аналог strdup, типа функций вида datadup8() datadup16() datadup32(), отдельно для конкатенаций надо перебирать еще разные варианты datacat8_8() datacat8_16() datacat8_32() datacat16_8() ... и тут еще нужно как-то указывать, в какую строку оно должно попытаться сконкатенировать
Ну типа если надо из двух array_8 слепить array_16 то будет так
Для контроллеров можно оставить только те функции, которые реально нужны. Если массивов размером до 256 байт хватит на всё, оставить только datadup8() и datacat8_8_8(). Ну и сделать еще макросов DATADUP8_ALLOCA() и DATACAT8_8_8_ALLOCA() которые б разворачивались в хрень с alloca для выделения на стеке, чтобы хип не использовался
Да, в Qt QString -- это просто указатель на блок, в котором лежит счётчик ссылок, длина строки, длина буфера, какие-то флаги и сам буфер (ushort array[1]).
А в libstdc++ три поинтера: начало, конец строки и конец буфера.
Ну вот этот gets не переполняется, кстати. Он же диапазон получает а не указатель. Ну и возвращает заполненный им кусок для обработки. И не надо никаких ноликов и прочей срани в конце. А strtok данные не портит, просто двигает рейндж дальше и возвращает рейндж на откушенный токен.
j123123 # 0
https://govnokod.ru/27679#comment710504
Это конечно так делать не надо, хуета какая-то. Надо чтоб "генератор лексических анализаторов"
bormand # 0 ⇈
Да не, можно и без генератора что-то вменяемое накобенировать из примитивных парсеров. Там единственно класс грамматик поуже чем у бизона и надо очень аккуратно с рекурсией.
JloJle4Ka # 0 ⇈
bormand # 0 ⇈
JloJle4Ka # 0 ⇈
guest # 0 ⇈
Вспоминается история Икануса про двух людей, спорящих про DN.
Один говорил про Duke Nukem, а другой про Dos Navigator
JloJle4Ka # 0 ⇈
JloJle4Ka # 0 ⇈
ObeseYoung # 0 ⇈
ASD_77 # 0 ⇈
JloJle4Ka # 0 ⇈
bormand # 0 ⇈
Ну... видимо ты какую-то недетерминированную грамматику туда захуярил и бедный парсер её перебором с откатами потом разбирал?
Я не вижу других причин.
guest # 0 ⇈
bormand # 0 ⇈
Тот же бизон умеет и вперед немножко подглядывать для разрешения конфликта и форкать стейт в неоднозначных точках и смотреть какой выживет.
Не помню уже названия для этих классов грамматик
j123123 # 0 ⇈
Это как в крестоговне с "жизнеспособностью" при вызове правильной функции https://govnokod.ru/27443#comment630395 ?
Можно считать баллы у двух или более стейтов по каким-то критерям, и выживает вореант, набравший максимум баллов.
А если сделать хуйню, где правила определения коэффициента жизнеспособности вореанта парсинга хуйни можно будет описывать на тьюринг-полном языке в виде специальной аннотации, парсинг может никогда не завершиться
bormand # 0 ⇈
bormand # 0 ⇈
bormand # 0
Кому нужны генераторы, если есть десяток трудолюбивых олимпиадников?
guest # 0
Ого, не знал, что так можно.
[email protected] # 0 ⇈
guest # 0 ⇈
bormand # 0 ⇈
Вряд ли без перемычки возможно это разделение ответственности.
> посылать в УК
Чтобы они потом засудили тебя нахуй за то что дом оставил без отопления? )))
Лучше позвони им и попроси байпасс приделать как положено.
guest # 0 ⇈
Охуенно же
Ну вообще я имел ввиду, что они должны поставить байпасс, а не требовать от меня "открыть кран"
bormand # 0 ⇈
У юристов не бывает транзитивности, емнип.
Нельзя взять и сократить "сварщик не доделал работу и мне жарко" + "я закрыл кран и оставил соседей без тепла" до "сварщик не доделал работу и оставил соседей без тепла".
guest # 0 ⇈
Есть же какие-то законы, говорящие что я могу и не могу делать.
Я не могу портить общедомовое имущество
Я могу делать что угодно со своим имуществом
Кран -- мое имущество
Если электрик сойдет с ума, и заземление из моей квартиры с этажа проведет к батарее соседки, и ее ебнет, буду ли я виноват в том, что включил в розетку стиралку с металлическим корпусом?
bormand # 0 ⇈
Первый раз наверное простят, так же как если ты откроешь кран когда соседи пожалуются.
Но вот если ты знал о проблеме и умышленно не открываешь кран или продолжаешь юзать эту машинку несмотря на просьбы соседей -- то ты пидор и будешь за это отвечать. Как и накосячивший электрик/сантехник.
bormand # 0 ⇈
Ну как сказать... вроде бы по закону ты не можешь приварить радиатор слишком большой площади, т.к. это создаст дизбаланс соседям. Скорее всего блокировка потока в те же нормы прописана.
[email protected] # 0 ⇈
[email protected] # 0 ⇈
Весь стояк остался без тепла? УК придётся вернуть деньги за некачественно оказанную услугу → УК стребует эти деньги с тебя. Если УК оштрафуют, они и сумму штрафа с тебя могут истребовать. Из-за резко закрытого крана выбило стык на чердаке и 10 квартир оказались залиты кипятком? Плати. Да, он был проржавевшим насквозь, но «система успешно прошла испытания перед началом отопительного сезона, экспертиза установила причиной неквалифицированные действия guest6, спровоцировавшие гидроудар, поднявший давление в отдельных участках отопительной системы намного выше нормальных эксплуатационных величин». Чей-то попугайчик замёрз? Надеюсь, он не был очень дорогим.
guest # 0 ⇈
// я другой гость
bormand # 0 ⇈
Нет. См. пример про телек ночью.
bormand # 0 ⇈
З.Ы. Я помню у нас в доме тоже как-то завёлся пидор с последовательно подключенным краном, которому было жарко зимой... Всем стояком его искали чтобы выебать.
guest # 0 ⇈
j123123 # 0 ⇈
bormand # 0 ⇈
guest # 0 ⇈
bormand # 0 ⇈
Ситуация ничем не отличается от тех, у кого кранов вообще нет.
guest # 0 ⇈
bormand # 0 ⇈
guest # 0 ⇈
> со стояком его искали, чтобы выебать
JloJle4Ka # 0 ⇈
guest # 0 ⇈
пиздекц
[email protected] # 0 ⇈
guest # 0 ⇈
Почему при этом отключилисб батареи у соседей я не знаю
Вероятно, УК что-то криво провел
Разве это моя вина?
Это вина УК
А свет я могу себе выключить? Вдруг он тоже соседям холодильник отключит?
bormand # 0 ⇈
j123123 # 0 ⇈
https://aqua-rmnt.com/interesnoe/zachem-nuzhna-peremychka-na-bataree-otopleniya.html
guest # 0 ⇈
вопрос в том, кто это должен делать
bormand # 0 ⇈
- Ты оставил соседей без тепла, поэтому ты обязан открыть кран.
- Мудак, варивший трубы, не доделал работу, поэтому он должен её закончить. Бесплатно.
Ну собственно если он из УК, туда и обратись.
guest # 0 ⇈
Вот этот момент мне непонятен. Кран мое имущество, стояк общедомовое.
Общедомовое я не имею права трогать, а кран имею: я его ставил за свои деньги, я за него отвечаю, если он протечет -- то я буду платить денег.
По-моему соседи должны выебать УК, и УК должны послать мне сантхника, которому я обязан предоставить доступ к стояку (как к общедомовому имуществу) и он должен поставить туда байпасс
bormand # 0 ⇈
Какой эгоизм ))))
Не, ну если они согласны -- я думаю никто и не заставит открывать кран. Но они УЖЕ пожаловались, раз управляшка к тебе пришла.
guest # 0 ⇈
Я не против открыть кран на время пока они ставят байпасс, но мне совершенно не понятно почему я обязан постоянно сидеть с этим краном, если это косяк управляйки?
У меня просто горит жопа от того, что если кран протекает, то это ТВОЙ кран и ты должен нижним соседям полтора ляма
Если ты хочешь его поменять, то это ТВОЙ кран и ты платишь сантехнику за его замену
А если ты хочешь его закрыть, то сразу это общий кран, и делать этого нельзя.
Хуйня же, ну?
bormand # 0 ⇈
Хотя казалось бы -- это твой телек в твоей хате.
ObeseYoung # 0 ⇈
[email protected] # 0 ⇈
Разве это моя вина?
guest # 0 ⇈
А кран мое
Я просто хуею с того, что если кран потечет то я буду его менять за свой счет
но закрыть не могу
bormand # 0 ⇈
guest # 0 ⇈
bormand # 0 ⇈
Ну почему... в теории ты можешь его поменять за счёт завода, который делал кран или сварщика если они обещали, что всё будет заебись N лет.
guest # 0 ⇈
но это мои отношения с тем, кто его ставил
Важно, что управляйка его не ставила в данном случае
bormand # 0 ⇈
bormand # 0 ⇈
Так всё-таки кто кран то поставил?
Рукожоп из управляйки или рукожоп которого ты сам нанял?
В первом случае они откроют кран на время, приварят байпасс и дадут пиздюлей рукожопу.
Во втором случае они придут, откроют кран и ты будешь сам разбираться с рукожопом и/или варить за свой счёт.
Desktop # 0 ⇈
bormand # 0 ⇈
Как страшно жить в этом мире...
ObeseYoung # 0 ⇈
guest # 0 ⇈
Совершенно верно.
Если управляющая компания не заделала дырку в фановой трубе (в смысле в стояке между этажами), то она ее должна заделать.
Она не имеет права сказать "не срите пожалуйста, потому что иначе соседей зальет"
guest # 0 ⇈
Странно, что так можно в C
А вон там снизу подсказывают, что это в GCC можно
j123123 # 0
можно подумать, что тут какая-то хуйня
_builtin_clzll() должна посчитать лидирующие нулевые биты в числе(для типа unsigned long long - см. https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html ), а мне тут нужно получить позицию последнего единичного бита, если считать от младшего к старшему. Например, если есть число, которое в двоичном представлении имеет вид
то мне надо вернуть 4 т.к. в четвертой позиции этот бит находится
И тут поэтому будет выделено памяти в худшем случае в 2 раза больше, а в лучшем случае на 1 бит больше, чем надо. https://wandbox.org/permlink/Plw7PlVbQ7hGajFd
Структура stack:
Этот nodes[] - flexible array member, чтобы не указатель на хуйню хранить, а просто сзади структуры. https://port70.net/~nsz/c/c99/n1256.html#6.7.2.1p16
j123123 # 0 ⇈
Я вот попробовал посмотреть в libstdc++ из GCC, там какая-то ебаная непонятная хуйня написана.
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/stl_vector.h
Но непохоже, чтобы оно в эту "struct _Vector_base" что-то непосредственно встраивало
bormand # 0 ⇈
А оптимизация для мелочи с хранением прям в самом векторе не везде есть.
j123123 # 0 ⇈
Почему реализация STL из GCC такое ебаное говно с кучей "#if" и "#ifdef" и всяким макроговном? Это принципиально нельзя написать нормальным образом?
bormand # 0 ⇈
А нафиг за ней так далеко лазить?
j123123 # 0 ⇈
Ну вот например можно хранить вектор как
или
Чем второй вариант хуже чем первый?
bormand # 0 ⇈
j123123 # 0 ⇈
bormand # 0 ⇈
И вот как раз во втором варианте до длины лишнее разыменование.
j123123 # 0 ⇈
А если я передаю указатель на вторую структуру (где T array_data[]; // flexible array member ) то надо лишь добавить к указателю на такую структуру размер size_t, и вот уже можно читать данные
bormand # 0 ⇈
Вторая структура по одному указателю r/o. Для ресайза надо двойную индирекцию. И встраивается только по указателю.
j123123 # 0 ⇈
А первая структура может сама быть выделена на стеке например, и уже указатель будет на хип указывать. И можно сделать массив таких структур т.к. размер самой структуры там фиксирован. А для второй структуры только массив из указателей получится сделать
j123123 # 0 ⇈
Ну хорошо, а допустим если мне нужны константные (т.е. неизменяемые в рантайме) строки из байт, как более адекватная замена нуль-терминированным говнострокам сишки, но чтобы без Шлемазла Шлемиэля т.е. чтоб не нужно было прочитывать строку до конца для узнавания размера строки? И для такой хуйни понаделать структурок
Можно например сделать варианты
И для такой хуеты понаделать аналог strdup, типа функций вида datadup8() datadup16() datadup32(), отдельно для конкатенаций надо перебирать еще разные варианты datacat8_8() datacat8_16() datacat8_32() datacat16_8() ... и тут еще нужно как-то указывать, в какую строку оно должно попытаться сконкатенировать
Ну типа если надо из двух array_8 слепить array_16 то будет так
и это еще можно в макросню типа _Generic завернуть, чтобы удобно было
bormand # 0 ⇈
Надеюсь вся эта кобенаторика не сожрёт профит от компактных строк.
j123123 # 0 ⇈
bormand # 0 ⇈
guest # 0 ⇈
какой утф ))
ObeseYoung # 0 ⇈
bormand # 0 ⇈
У 32-битки оверхед при n>=256 в районе процента. А меньшие покрывает компактная 8-битка.
bormand # 0 ⇈
bormand # 0 ⇈
max(alignof(T), sizeof(size_t)), но не суть. Подумаешь немного байтов проебали в начале вектора. Некритично.
Да и size_t обычно и так один из самых жирных типов. Больше только аппаратные вектора.
bormand # 0 ⇈
Первую структуру ты можешь передать по значению через регистры. И сразу начать поиск, трогая только те кешлайны, что реально нужны для работы.
Со второй структурой ты вынужден загрузить лишний кешлайн в котором лежит размер. А этот кешлайн в большинстве случаев не пригодится при поиске.
bormand # 0 ⇈
bormand # 0 ⇈
А в libstdc++ три поинтера: начало, конец строки и конец буфера.
guest # 0 ⇈
А сами данные могут быть где угодно, это как аллокатор решит, могут быть и в куче
bormand # 0 ⇈
j123123 # 0 ⇈
Какая секурность )))
bormand # 0 ⇈
В асме это тоже должно неплохо смотреться.
guest # 0 ⇈
guest # 0 ⇈
bormand # 0 ⇈