programacion - lenguaje c++
Cómo pasar grandes estructuras de ida y vuelta entre C++ y Lua (4)
Estoy buscando incrustar Lua en una aplicación de C ++ que estoy desarrollando. Mi intención es utilizar Lua para programar qué operación (es) ordenada (s) realizar para alguna entrada dada, es decir. recibir un nuevo elemento de trabajo en el programa c ++, pasar detalles al backend de Lua, Lua vuelve a llamar a c ++ para llevar a cabo el trabajo necesario, devuelve los resultados finales.
La estructura de datos primaria involucrada es una estructura grande (aproximadamente 80+ miembros). Soy (muy) nuevo en Lua y no estoy seguro de cómo puedo pasarlo a mi aplicación de host y el estado de Lua incrustado.
Hasta ahora veo mis opciones como:
a) Empujar / hacer estallar todos los miembros de datos individuales en la pila al cruzar a / desde C ++ y Lua (suena desordenado).
b) Construir una tabla y poblar con los valores, luego poner / cerrar la pila (un poco más limpio).
c) Pasarlo como datos de userdata
(¿liviano / pesado?) (estoy incompleto sobre esto, y no estoy seguro si / cómo puedo acceder a él desde el lado de Lua para consultar qué operaciones son necesarias).
Cualquier orientación sería muy apreciada.
No he hecho esto por mi cuenta ( pasaron años desde que utilicé Lua, y nunca lo he usado de manera integrada), pero creo que deberías ver metatablas y el tipo de datos de usuario. El manual dice esto acerca de los valores de userdata:
Este tipo corresponde a un bloque de memoria sin procesar y no tiene operaciones predefinidas en Lua, excepto la asignación y la prueba de identidad. Sin embargo, al utilizar metatablas, el programador puede definir operaciones para valores de datos de usuario (ver §2.8). Los valores de los datos de usuario no se pueden crear ni modificar en Lua, solo a través de la API C
Suena bien.
Si recuerdo correctamente, light userdata es en realidad solo un puntero. Todos comparten el mismo metatable En su mayoría se utilizan para pasar direcciones de datos C.
Los datos de usuario completos probablemente estén más cerca de lo que necesita si debe acceder desde el lado de Lua. Su metatabla le permitiría acceder a él como si fuera una tabla regular de Lua, por ejemplo.
También podría estar interesado en la biblioteca de Roberto para convertir datos hacia y desde las estructuras C para Lua 5.1 . O no. Depende de tus necesidades ... :-)
Exponer toda la representación a Lua puede no ser lo que quieres. ¿Tal vez solo expone algunas operaciones? Luego use un puntero a la estructura como datos de usuario ligeros. No puede tener un metatabla, por lo que debe usar funciones explícitas.
Si quiere exponer todo, su mejor opción es, probablemente, enviar datos de usuario completos que contengan solo un puntero a la estructura. Esto significa un nivel extra de indirección --- perdido en el ruido desde el punto de vista del rendimiento, pero es fácil equivocarse, así que mantenga un punto único de verdad donde cruce el límite C ++ / Lua.
Con los datos de usuario completos puede usar macros (¡el horror!) Para poner las funciones getter y setter para cada campo. Esto es mucho trabajo que hacer a mano, y es posible que prefiera consultar tolua ++ aunque tenga mucho equipaje.
¡Ve a la lista de correo de Lua!
Si yo estuviera donde usted, pasaría una referencia a la estructura y luego dejaría que Lua llame a las funciones C para modificarlo. Esto también significa que puede actualizar el sistema con menos problemas que si Lua tiene que conocer todos los detalles del sistema subyacente.