Daniil
https://github.com/iryont/lua-struct
А, да, видел. Сяп.
Прикольная штука, но ради одного кейса пока в проект подливать какую-то либу не хочется.
По сути, мне надо просто указать размер записанных данных перед самими данными.
Как вариант рассматривалось ещё прям hex положить сначала. Но такое...
Из плюсов то, что не зависит от разрядности, но вместо 4 байт получается 8 (и 16 вместо 8, соответственно) - эт не очь хорошо.
Snusmumriken
Daniil
Ага, крч, просто как uint32 записал - должно быть норм. Там и формула преобразования простенькая даже для чистого Lua, и места немного занимает, и кейс закрывает.
Константин
Чуваки, кто встраивает lua, получается чтобы забиндить свой тип, нужно создать fulluserdata, и к нему присобачить метатаблицу с index и newindex?
Snusmumriken
Чуваки, кто встраивает lua, получается чтобы забиндить свой тип, нужно создать fulluserdata, и к нему присобачить метатаблицу с index и newindex?
О, привет дланговцам.
Да, когда ты биндишь свой тип в fulluserdata, ты такой берёшь, луёвыми средствами размечаешь блок памяти под эту юзердату, допустим
int lua_newVec(lua_State * L, float x, float y) {
Vector2 * v = (Vector2 * )lua_newuserdata(L, sizeof(Vector2));
// сама юзердата находится на стеке
// мы ранее объявляли метатаблицу Vector2 в реестре
// через luaL_newmetatable(L, "Vector2");
luaL_getmetatable(L, "Vector2");
lua_setmetatable(L, -2); // присобачиваем к userdata метатаблицу Vector2, она уходит со стека
v->x = x;
v->y = y;
return 1; // возвращаем юзердату в луа
}
Луа при этом управляет памятью, когда этот объект будет недоступен из луа, луа же его и соберёт, опционально дёрнув деструктор из метатаблицы.
Snusmumriken
__index в метатаблице тебе нужен для получения методов и полей юзердаты.
__newindex для задания новых полей (в юзердате нет собственных полей, поэтому оно будет вызываться всегда)
Snusmumriken
Конкретно для полей, я обычно делаю что-то такое:
Snusmumriken
Ммм, зачем его ломать?
Snusmumriken
Луа сама соберёт его память, вызвав метаметод __gc если есть. Там всё удаление, если ты размечал дополнительную память для данной юзердаты.
Константин
Вместо
local a = some_vec.x;
local b = some_vec.y;
Snusmumriken
Смотри как это выглядит на луёвой стороне:
local vec = vec2_new(10, 20)
vec.x = 30 --> вызовется __newindex со строковым ключом x.
vec.y = 50 --> вызовется __newindex со строковым ключом y.
Никто не мешает отдельно делать геттеры и сеттеры.
vec:set(50, 60)
и
local x, y = vec:get()
Константин
Оо, local a, b = vec.xy();
Snusmumriken
Оо, local a, b = vec.xy();
Так тоже можно но это жесть обработка пользовательского ввода, xyzz-ать придётся вручную, обрабатывая строковый ключ и выдавая параметры по полю.
Snusmumriken
Но суть не принципиальна. Мы ведь не конкретно над векторами работаем, мы хотим работать с юзердатой как с обычной луёвой табличкой, опционально с метатаблицей. И мы это получаем.
Берём любой структ, делаем его на луёвой стороне и высылаем луям.
Snusmumriken
Единственное с чем могут возникнуть проблемы — юзердата которая должна управляться с чисто сишной стороны. Как правило это куски каких-нибудь фреймворков, например CEF (который хромиум) выдаёт наружу целый здоровый массив текущего отрендеренного кадра браузера в BGRA, и его крайне нежелательно менять, но и копировать в луа может быть дорого, поэтому мы такие можем взять, и сделать структуру-обёртку с указателем на этот массив, и меткой актуальности, чтобы все операции с ним можно было делать только пока CEF его не поломал. И рыбку съели и разметку памяти не перегрузили.
Snusmumriken
И да, ты всегда можешь положить на обработку __index и __newindex здоровый болт, и сделать как раз функции-геттеры и сеттеры для каждого поля, будет простым набором функций. Главное чтобы в __index метатаблицы юзердаты была таблица с заданными тобой методами.
Andrey
Всем привет! Коллеги можете объяснить иногда zbstudio ведет себя не стабильно особенно на командах print
Andrey
что здесь означает Неправильный путь приложения ?
Andrey
А у кого нить такое было уже ? Чем и как лечить рекомендуете ?
Andrey
Проблему по моему решил очень странным образом. Скачал архив без инсталлятора. Запустил экзешник (на диске C в загрузках) внезапно оно перестало падать
A
Хммм, если это код из твоего проекта, я бы добавил destruct, типо
a, b = some_vec.destruct()
Вы имеете в виду "деструктурирующее присваивание", lua так из коробки может, а snus, вероятно, destruct как деструктор, т.е. функцию очистки, если за собой надо что-то убирать (например, динамическую память, выделенную в C при __newindex)
Leon174
По сути это вообще единственный способ получить zbs, если не брать в расчет последний релиз двухгодичной давности.
Andrey
Andrey
пофиг, двухгодичная давность тоже устроит
Константин
Andrey
Коллеги подскажите еще пожалуйста такую штуку - есть текст в двубайтной кодировке utf8 / ansi у одних русских букв размер 2 байта у других по одному, необходимо считать правильный размер в буквах - ни у кого под рукой функции не завалялось ?
Константин
Константин
И это вроде в стд Луи есть
Andrey
да, только в тексте есть еще латинские
Andrey
и деление на два не поможет
Константин
В документации lua есть
Leon174
https://q-syshelp.qsc.com/Content/Control_Scripting/Lua_5.3_Reference_Manual/Standard_Libraries/4_-_Basic_UTF-8_Support.htm
Константин
А когда я смогу стать смешариком, и постить ссылки?
Leon174
Чуть позже, настояться надо, мхом обрасти.
Константин
Godruma-vihari Dasa
В Lua 5.4 есть функция utf8.len, которая считает символы
Andrey
так. а у меня только 5.3
Andrey
но спасибо!
Andrey
в 5.3. тоже есть!
Константин
А вообще, какой сейчас стандарт Луи считается, ну, самым стандартным.
Константин
5.1?
Leon174
У 5.1, пожалуй, перевес из-за luajit.
Luсky
Кеня
кто перехватом трафика занимается?
Egor
Snusmumriken
Затея интересная
Джифорсович
Будешь,вот,так,без,пробелов,кавычки,писать,лично,буду,шеймить
Кеня
не кавычки
Кеня
а запятые
Кеня
😏
Highly Likely
Будешь,вот,так,без,пробелов,кавычки,писать,лично,буду,шеймить
Кавычки, лол
Джифорсович
запятые, сори, я хохолд
Джифорсович
Вибачтэ пробачтэ
Yaroslav
Привет. Подскажите плз по паттернам для string.match() , как мне сделать строгий поиск вхождения? Например, нужен поиск подстроки http, без учета https
Vyacheslav
ну ты же понимаешь, что так не бывает
Vyacheslav
в строке https есть строгое совпадение с http
Yaroslav
А если по кол-ву символов?
Yaroslav
дополнительно
Yaroslav
В общем просто в лоб проверяю, что нету метчинга по https и потом проверять что есть http)
Джифорсович
Джифорсович
Yaroslav
Джифорсович
Aydar
Джифорсович
Джифорсович
http:
Джифорсович
Snusmumriken
Tony
Wsevolod
Wsevolod
И даже не посикс
Yaroslav