Passing C struct pointer to lua script

你说的曾经没有我的故事 提交于 2019-12-07 01:54:04

问题


I would like to know is there a way to pass a struct pointer to a lua script, and reach it's members from lua without copy (for read and write purposes).

So, for example is it possible to overwrite a member of a c struct directly through of its pointer?

(I am using luajit)


回答1:


Seeing as you have tagged this for luajit, you can combine the light userdata (as mentioned by others) with FFI for direct struct member access, see the tutorial here: http://luajit.org/ext_ffi_tutorial.html




回答2:


In addition to Tim's answer, you can also go for light userdata. You don't end up with a copy of your data in the Lua stack, all you push to Lua is a pointer.

Lua has no understanding of what is in this pointer, whether it still points to valid memory, or how to access any objects in this pointer, so you'll have to handle all of this yourself in C. I am usually sending a pointer to an item on a list, so if there's any risk that entry has been deleted from the list, I first iterate over the list to validate the pointer (not a big deal if your lists are short). To access items within the pointer in Lua, you need to write get/set functions in C that you can call from Lua.

To get started, here are the entries on pushing and retrieving the lightuserdata:

  • lua_pushlightuserdata - push an entry on the stack
  • lua_touserdata - retrieve the pointer value
  • lua_islightuserdata - validate entry is light userdata
  • Programming in Lua entry on light userdata



回答3:


The way to do this is with a lua userdata. Here are a couple examples: link, another link.



来源:https://stackoverflow.com/questions/7298642/passing-c-struct-pointer-to-lua-script

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!