2011-09-04 8 views
6

Me gustaría saber si hay una manera de pasar un puntero struct a una secuencia de comandos lua, y llegar a sus miembros desde lua sin copia (para fines de lectura y escritura).Pasando el puntero C struct a la secuencia de comandos lua

Entonces, por ejemplo, ¿es posible sobrescribir un miembro de una estructura directamente a través de su puntero?

(estoy usando luajit)

Respuesta

5

Como ha etiquetado esto para luajit, puede combinar los datos de usuario ligeros (como lo mencionaron otros) con FFI para el acceso directo de miembro de estructura, consulte el tutorial aquí: http://luajit.org/ext_ffi_tutorial.html

+0

Oh, wow. No sabía sobre esto. Este es definitivamente el camino a seguir si está usando luajit. –

1

La forma de hacerlo es con un userdata lua. Aquí hay algunos ejemplos: link, another link.

6

Además de la respuesta de Tim, también puede optar por light userdata. No terminas con una copia de tus datos en la pila de Lua, todo lo que presionas para Lua es un puntero.

Lua no entiende qué hay en este puntero, si todavía apunta a la memoria válida, o cómo acceder a cualquier objeto en este puntero, por lo que tendrá que manejar todo esto usted mismo en C. Normalmente estoy enviar un puntero a un elemento en una lista, por lo que si hay algún riesgo de que la entrada se haya eliminado de la lista, primero repito la lista para validar el puntero (no es un gran problema si las listas son cortas). Para acceder a los elementos dentro del puntero en Lua, necesita escribir funciones get/set en C a las que puede llamar desde Lua.

Para empezar, aquí están las entradas de empuje y recuperar el lightuserdata:

Cuestiones relacionadas