Size: a a a

2020 April 17

I

Igor725 in pro.lua
А вообще приучивай себя на английском читать, потому что огромного количества информации просто нет на русском
источник

AZ

Aydar Zarifullin in pro.lua
Stunni
Ок
источник

S

Stunni in pro.lua
)
источник

S

Snusmumriken in pro.lua
Aydar Zarifullin
Хочу запушить на луашный стэк юзердату, просто указатель на сишную структуру

static void push_emenu_t(lua_State *L, emenu_t *menu) {
 emenu_t *menu_ud = lua_newuserdata(L, sizeof(menu*));
 *menu_ud = menu;
  luaL_setmetatable(L, "emenu_t");
}

1) Надо ли писать gc функцию или луа сам уберет юзердату?

2) Что принято возвращать в функциях типа push_something?
Есть два типа юзердаты:
1. lightuserdata — это просто указатель на сишную структуру, тут НЕ работают метатаблицы, и оно всегда одинаковое: то есть, ты можешь десять раз выгрузить в луа указатель, и он всегда будет одним и тем же (ptr1 == ptr2 => true)
2. fulluserdata — сишная структура, которая управляется луёвой стороной. Разметка и сборка производится луями, работают метатаблицы включая __gc и т.д. Тут — если ты делаешь lua_newuserdata — каждый раз создаётся новая юзердата, то есть они никогда не равны между собой, даже если ты скопировал в них одну и ту же структуру.

Как правило, fulluserdata используется следующим образом:
MyType * ptr = lua_newuserdata(L, sizeof(MyType));
// КОПИРУЕМ значение по указателю юзердаты
*ptr = MyTypeStruct; // или *ptr = &MyTypeStructPtr
Простым присваиванием (menu_ud = menu;) — ты просто меняешь указатель, а не значение по нему.

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

AZ

Aydar Zarifullin in pro.lua
Snusmumriken
Есть два типа юзердаты:
1. lightuserdata — это просто указатель на сишную структуру, тут НЕ работают метатаблицы, и оно всегда одинаковое: то есть, ты можешь десять раз выгрузить в луа указатель, и он всегда будет одним и тем же (ptr1 == ptr2 => true)
2. fulluserdata — сишная структура, которая управляется луёвой стороной. Разметка и сборка производится луями, работают метатаблицы включая __gc и т.д. Тут — если ты делаешь lua_newuserdata — каждый раз создаётся новая юзердата, то есть они никогда не равны между собой, даже если ты скопировал в них одну и ту же структуру.

Как правило, fulluserdata используется следующим образом:
MyType * ptr = lua_newuserdata(L, sizeof(MyType));
// КОПИРУЕМ значение по указателю юзердаты
*ptr = MyTypeStruct; // или *ptr = &MyTypeStructPtr
Простым присваиванием (menu_ud = menu;) — ты просто меняешь указатель, а не значение по нему.

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

S

Snusmumriken in pro.lua
Метатаблица с индексом типа __class = "myclass"
источник

S

Snusmumriken in pro.lua
А так — в луях уже есть неплохие встроенные инструменты для ООП: lua_newmetatable(L, "classname")
источник

S

Snusmumriken in pro.lua
А потом такой:
mytype * ptr = (mytype *)luaL_checkudata(L, 1, "classname");
источник

S

Snusmumriken in pro.lua
Кстати, если ты передаёшь в луа чисто поинтер — то придётся делать чот такое:

// размечаем юзердату размером с указатель
MyType * ptr = lua_newuserdata(L, sizeof(MyType *));
// вставляем указатель в качестве значения по указателю луёв
*ptr = MyTypeStructPtr;

А потом такой:
MyType * structptr = &ptr;
источник

S

Snusmumriken in pro.lua
Указатели — это весело. Тебе ещё предстоит в них вкурить нормально, весёлые времена null pointer exception'ов и утечек памяти.
источник

VM

Vadim Misbakh-Soloviov in pro.lua
/me так и не вкурил полностью в указатели
источник

F

FailsBot in pro.lua
Vadim так и не вкурил полностью в указатели
источник

VM

Vadim Misbakh-Soloviov in pro.lua
т.е. я, как бы, от случая к случаю могу их использовать, но вот стопроцентного понимания этих *, **, & и иже с ними так и не пришло (т.е. каждый раз приходится заново вспоминать, как там именно где и кого разыменовывать чтобы преобразовать один указательный тип в другой
источник

VM

Vadim Misbakh-Soloviov in pro.lua
вообще ненавижу это дело
источник

VM

Vadim Misbakh-Soloviov in pro.lua
:E
источник

AZ

Aydar Zarifullin in pro.lua
Snusmumriken
Кстати, если ты передаёшь в луа чисто поинтер — то придётся делать чот такое:

// размечаем юзердату размером с указатель
MyType * ptr = lua_newuserdata(L, sizeof(MyType *));
// вставляем указатель в качестве значения по указателю луёв
*ptr = MyTypeStructPtr;

А потом такой:
MyType * structptr = &ptr;
Да в курсе я про указатели (но полноценно осилить их не могу)
источник

AZ

Aydar Zarifullin in pro.lua
Луашный стек такую же ментальную нагрузку создаёт, вроде и знаешь сколько элементов туда положил и в то же время сомневаешься.
источник

S

Snusmumriken in pro.lua
Дело привычки
источник

I

Igor725 in pro.lua
Vadim Misbakh-Soloviov
т.е. я, как бы, от случая к случаю могу их использовать, но вот стопроцентного понимания этих *, **, & и иже с ними так и не пришло (т.е. каждый раз приходится заново вспоминать, как там именно где и кого разыменовывать чтобы преобразовать один указательный тип в другой
У меня как-то само пониматься начало после недели работы с чистыми сишками, уже всё на автомате делаю
источник

F

FailsBot in pro.lua
Vyacheslav
источник