20070709 LUA 调用 C 函数 多个返回值  1
http://www.yippeesoft.com

static int average(lua_State *L)
&leftsign;
 /* get number of arguments */
 int n = lua_gettop(L);
 double sum = 0;
 int i;

 /* loop through each argument */
 for (i = 1; i <= n; i++)
 &leftsign;
  /* total the arguments */
  sum += lua_tonumber(L, i);
 &rightsign;

 /* push the average */
 lua_pushnumber(L, sum / n);

 /* push the sum */
 lua_pushnumber(L, sum);

 /* return the number of results */
 return 2;
&rightsign; //平均值 函数

void CTestLuaSpDlg::OnLuaF()
&leftsign;
 // TODO: 在此添加命令处理程序代码
 lua_State *L = lua_open();
 

 /* load Lua base libraries */
 lua_baselibopen(L);

 lua_register(L, "average", average);
 const char *buf = "r1,r2=average(500, 10)  return r1,r2"; 返回两个

 luaL_dostring(L, buf);

 /*lua_pushstring(L,"r1");
 lua_pushstring(L,"r2");*/
 //lua_gettable(L,LUA_GLOBALSINDEX);
 lua_getglobal(L,"r1"); 直接读取全局变量
 int result = lua_tonumber(L,-1);
 lua_getglobal(L,"r2");
  result = lua_tonumber(L, -1);

 lua_close(L);
&rightsign;

~~~~~~~~~~~~~~~
void CTestLuaSpDlg::OnLuaG()
&leftsign;
 // TODO: 在此添加命令处理程序代码
 /* initialize Lua */
 L = lua_open();

 /* load Lua base libraries */
 lua_baselibopen(L);

 /* register our function */
 lua_register(L, "average", average);

 /* run the script */
 
 /*const char *buf = "avg, sum = average(10, 20, 30, 40, 50);return sum";

 int ii=luaL_dostring(L, buf);*/
 
  luaL_loadfile(L, "\\\\Storage\\\\Program Files\\\\TestLuaSp\\\\add.lua") ;
  //加载后要用lua_resume运行.
  lua_resume(L,0);

  //调用脚本中函数
  lua_getglobal(L, "lua_func1");

  //传给lua_func1参数1,参数2
  lua_pushnumber(L, 21);
  lua_pushnumber(L, 23);

  //调用lua中函数,传入个参数,有一个返回值 ,看lua_call 和lua_pcall区别
  lua_pcall(L, 2, 2, 0); 要求返回两个返回值

  //取值
  lua_Number retsum;

  //注意返回值是通过-1来获取
  retsum = lua_tonumber(L, -1);
  lua_pop(L,1);
  retsum = lua_tonumber(L, -1);
 /* cleanup Lua */
 lua_close(L);

 
&rightsign;

function lua_func1(val1, val2)
 –调用cbuilder中函数
 val1,val2 = average(val1, val2)
 return val1,val2
end

全局变量:
全局变量也是容易的在lua中被处理,像我们看到的。
lua_getglobal()将把lua中的全局变量压入堆栈。如果lua脚本中包括一个叫做"z"的全局变量,例如。这段代码:
lua_getglobal(L, "z");
z = (int)lua_tonumber(L, 1);
lua_pop(L, 1);
这里还有一个相对的设置全局变量的函数lua_setglobal(),例如:
lua_pushnumber(L, 10);
lua_setglobal(L, "z");

在lua文件中不是必须显示的声明一个全局变量。
如果lua文件中没有相应的变量。用lua_setglobal()将会创建这个变量

历史博文

标签:, , , ,
三月 31, 2008 at 3:57 下午 by yippee 1,063 次
Category: Dev
Tags: , , , ,