lua入门之二:c/c++ 调用lua及多个函数返回值的获取

来源:互联网 发布:telnet使用的端口号 编辑:程序博客网 时间:2024/05/27 16:41

当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 相同类型的栈来交互。C 函数从栈中获取她的参数,调用结束后将返回结果放到栈中。为了区分返回结果和栈中的其他的值,每个 C 函数还会返回结果的个数(the  function  returns  (in  C)  the  number  of  results  it  is leaving on the stack.)。

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. // luacallcpp.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5.   
  6. #include <stdio.h>  
  7.   
  8.   
  9. //lua头文件  
  10. #ifdef __cplusplus  
  11. extern "C" {  
  12. #include "lua.h"    
  13. #include <lauxlib.h>     
  14. #include <lualib.h>     
  15. }    
  16. #else  
  17. #include <lua.h>  
  18. #include <lualib.h>  
  19. #include <lauxlib.h>  
  20. #endif  
  21.   
  22.   
  23.   
  24. int static add(lua_State* L)  
  25. {  
  26.     //获取第一个参数  
  27.     double x=lua_tonumber(L,1);  
  28.     double y=lua_tonumber(L,2);  
  29.     //返回值压栈,压入两个返回值  
  30.     lua_pushnumber(L,x+y);  
  31.     lua_pushnumber(L,1000);  
  32.   
  33.     //返回值的个数,  
  34.     return 2;  
  35. }  
  36.   
  37.   
  38. int _tmain(int argc, _TCHAR* argv[])  
  39. {  
  40.   
  41.   
  42.   
  43.   
  44.   
  45.     lua_State * L=NULL;  
  46.   
  47.     /* 初始化 Lua */    
  48.     L = lua_open();    
  49.   
  50.     /* 载入Lua基本库 */    
  51.     luaL_openlibs(L);     
  52.   
  53.     /* 运行脚本 */    
  54.     luaL_dofile(L, "./script/func.lua");     
  55.   
  56.     //函数入栈  
  57.     lua_pushcfunction(L,add);  
  58.     //设置全局函数名  
  59.     lua_setglobal(L,"Add");  
  60.     //调用lua函数LUACALLCPP来反调cpp中的add  
  61.     lua_getglobal(L,"LUACALLCPP");  
  62.     lua_pushnumber(L,10);  
  63.     lua_pushnumber(L,34.33);  
  64.     //两个参数,两个返回值  
  65.     lua_pcall(L,2,2,0);  
  66.     //取返回值二  
  67.     printf("lua call cpp return val is %f \n",lua_tonumber(L,-1));  
  68.     //取返回值一  
  69.     printf("lua call cpp return val is %f \n",lua_tonumber(L,-2));  
  70.   
  71.   
  72.   
  73.   
  74.     /* 清除Lua */    
  75.     lua_close(L);     
  76.   
  77.     return 0;  
  78. }  


[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. --region *.lua  
  2. --Date  
  3. --此文件由[BabeLua]插件自动生成  
  4.   
  5. print("func.lua hava been loaded")  
  6.   
  7. function LUACALLCPP(x,y)  
  8. -- 调用c++中的函数  
  9. return Add(x,y)  
  10. --print(Add(x,y))  
  11. end  
  12.   
  13.   
  14.   
  15. --endregion  

运行结果:

0 0
原创粉丝点击