userdata и глубокие структуры

Когда мы расширяем lua при помощи C, мы используем userdata  — тип, который является куском C-данных, как правило структурой. Но что делать, если мы имеем дело со стуктурой, включающей в себя массив/иную структуру, с которыми надо работать?

Разумное решение — создать указатель на массив, который и хранить в userdata . lua_newuserdata  нам выдаст указатель на область памяти, мы туда запишем указатель. Когда мы обратимся к массиву, просто возьмём значение по указателю (да, это будет указатель!). Всё довольно-таки запутано, но это на то и многоуровневая адресация (указатель по указателю по указателю по указателю…).

Переходим к реализации: объявим глубокий указатель как

Далее, пусть он укажет на место, подконтрольное lua:

После, запишем по указателю указатель на нужную ячейку памяти:

Или, если это массив:

После этого, для получения и работы с ячейкой по укакзателю нам необходимо написать:

Теперь num  — указатель на нужную ячейку памяти! С ним можно работать как с указателем или массивом!

Добавить комментарий