Lecciones sobre la API

7 views
Skip to first unread message

esbxp

unread,
Aug 21, 2009, 9:25:46 PM8/21/09
to lua...@googlegroups.com
Hola:
 
     J.Luis. Hidaldo ...   me parece muy adecuadas las ilustraciones sobre la API,,, que aparecen en tu blog.  Incluso me quedo mas claro con las ilustraciones,,, algo de eso podria comentarlo en el paquete.. de ejemplos Lua... 

     Estuve viendo los muchos ejemplos que hay de cosas en la Wiki-l,,, pero como que el asunto de las Struct tiene pocas referencias,,, bueno hice 2 lecciones,, tratando de abarcar algunos aspectos claves,,, pero me tope con algunas dificultades que no se explican muy bien en el Manual.
      Lo que trataba de exponer es como Lua Declara y envia a traves de los argumentos de función algunos datos,,, aun no hablo de resultados, y pues bingo,, yo nose si se puede o no pasar como argumento un Array o Structura, que es creada en Lua,,, los ejemplos que hay dicen que se crea en C++ y luego se llaman los metodos para llenarla y alojarla,,, pero en C++, se puede crear una Structura Global b) en una función se crea y c) se pasa como argumento y d) se recibe en otra, weno aca plop... porque no supe... les dejo el codigo... Vc60 Win32 Console - Lua 5.1,,, vale !!!

 
Me pregunto si la gente de esta lista es buena resolviendo paradigmas...
Sino Chuta... estoy puro dando la hora !!!
 
Este ejemplo se estan pasando las cosas desde Lua hacia C++,,, 
El proximo será pasar argumentos desde C++ Hacia Lua.

/******************************************************************************
Leccion 3 - API Lua Recepción de Argumentos
******************************************************************************/
#include <iostream.h>
#pragma warning( disable : 4800)
#include <Lua.hpp>
//. Declara el State para lua 5.1
lua_State *LS = NULL;
/*****************************************************************************/
struct DATOS {
 bool  bActivo;
 float Grados;
 int   Vector;
 char  Nombre[20];
 char  *Archivo;
};

/*****************************************************************************/
Recibe los argumentos pasados desde Lua
/*****************************************************************************/
int myCuadrado(lua_State *L)
{
 cout << "myCuadrado : Ejecutando en C++ \n";
 cout << "bActivo : " << (bool)  lua_toboolean(L, 1) << endl;
 cout << "radio ..: " << (float) lua_tonumber(L,  2) << endl;
 cout << "speed ..: " << (int)   lua_tonumber(L,  3) << endl;
 cout << "Descrip.: " <<         lua_tostring(L,  4) << endl;
 cout << endl;
 return 0;
}
/*****************************************************************************
 La estructura DATOS creada en el script Lua
 es recibida aca junto con sus adicionales argumentos
******************************************************************************/
int myTriangulo(lua_State *L)
{
 int iType = 0;
 DATOS *dta = { NULL };
 cout << "myTriagulo : Ejecutando en C++ \n";
 iType = lua_type(L, 1);
 switch(iType){
 case LUA_TUSERDATA:
   cout << "LUA_TUSERDATA"      << endl;
   break;
    case LUA_TTHREAD:
   cout << "LUA_TTHREAD"        << endl;
   break;
 case LUA_TLIGHTUSERDATA:
   cout << "LUA_TLIGHTUSERDATA" << endl;
   break;
 }
 
 dta = (DATOS*) lua_touserdata(L, 1);
 if( dta != NULL){
   cout << " Datos { " << endl;
   cout << " -> bActivo....: " << (bool)  dta->bActivo << endl;
   cout << " -> Grados ....: " << (float) dta->Grados  << endl;
   cout << " -> Vector ....: " << (int)   dta->Vector  << endl;
   cout << " -> Nombre[20] : " <<         dta->Nombre  << endl;
   cout << endl;
 }
 return 0;
}

int main(int arg, char *argv[])
{
 LS = luaL_newstate();   //. Crea la Instancia de Lua 5.1
 luaL_openlibs(LS);      //. Abre todas las Librerias
 lua_gettable(LS, LUA_GLOBALSINDEX);
 lua_register(LS, "myCuadrado", myCuadrado);
 lua_register(LS, "myTriangulo", myTriangulo);
    //. luaL_dofile(LS, ".\\Leccion03.lua");
 //. Esta funcion siempre da 1 - Exista o no, el archivo
 //. La Reemplazamos por...
 int s = luaL_loadfile(LS, ".\\Leccion03.lua");
 if( s == 0){
  s = lua_pcall(LS, 0, LUA_MULTRET, 0);
 }
 cout << "Leccion03.lua - Finalizado \n";
 
 lua_close(LS);
 return 0;
}
 
y aca el Script de Lua ... "Leccion03.Lua"
--
-- llama las funciones declaradas e la C++ API
-- pasando argumento via Stack
--
io.write("Script Ejecutandose, Version " , _VERSION, "\n");
io.write("Llamando a myCuadrado() desde Script \n");
bActivo = true          -- Boolean
radio   = 22.453        -- double / float
speed   = 120           -- integer
Descrip = "NPC-Ty345"   -- string
myCuadrado( bActivo, radio, speed, Descrip );
 
 
io.write("Llamando a myTriangulo() desde Script \n");
-- Structura de Datos en el API --
-- Crea la Structura de Datos en Lua --
Datos = { }
Datos  = { bActivo = true;
           Grados  = 0.0245;
           Vector  = 342;
           Nombre  =  "NPC-5467";
           Archivo = ".\Bmp354.bmp";
          }
Array  = { "Lunes", "Martes", "Miercoles", "Jueves",
           "Viernes", "Sabado", "Domingo" }                -- Array de Datos
funcNm = PlayNPC                                               -- Puntero a un Función Declarada en C++ ????
 
-- Pasa la structura como 1er argumento de la Funcion, el Array, y la direccion de la Función --
myTriangulo( Datos, Array, funcNm );
io.Write("Script - Finalizado \n");
 

Gracias !!!
Bye !!!
      
 

 
 
Reply all
Reply to author
Forward
0 new messages