2008-11-12 15 views
5

Estoy buscando integrar Lua en una aplicación 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. recibe un nuevo elemento de trabajo en el programa C++, pasa los detalles al backend de Lua, Lua vuelve a llamar a C++ para llevar a cabo el trabajo necesario, devuelve los resultados finales.Cómo pasar una gran estructura de ida y vuelta entre C++ y Lua

La principal estructura de datos involucrada es una gran (aproximadamente 80+ miembros) struct. 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/Popping todos los miembros de datos individuales en la pila al cruzar a/de 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 userdata (¿liviano/pesado?) (No estoy seguro de esto, y no estoy seguro si/cómo puedo acceder desde el lado Lua para consultar qué operaciones son necesarias).

Cualquier orientación sería muy apreciada.

Respuesta

4

Si recuerdo correctamente, los datos de usuario de la luz son 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 están probablemente 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 le puede interesar Roberto library for converting data to and from C structs for Lua 5.1. O no. Depende de sus necesidades ... :-)

+0

Pude convertir los datos del usuario light a un objeto object-c. Me imagino que funcionaría igual para una estructura. –

3

No he hecho esto por mi cuenta (pasaron años desde que utilicé Lua, y nunca lo he usado de forma incrustada), pero creo que deberías consultar metatables y el tipo de datos userdata. El manual dice esto sobre 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.

1

Exponer toda la representación a Lua puede no ser lo que usted quiere. ¿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, la 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.

¡Ingrese a la lista de correo de Lua!

0

Si estuviera donde usted, enviaría una referencia a la estructura y luego dejaría que Lua llame a las funciones C para modificarla. Esto también significa que puede actualizar el sistema con menos problemas que si Lua tiene que conocer todos los detalles del sistema subyacente.

Cuestiones relacionadas