C遍历LUA表和调用LUA函数的简单Demo

废话就不多说了,直接进入正题.首先我们的LUA文件Test.lua看起来像是下面这样的:

T1={1,2,3,4,5,6,7,8,9}
T2={A="A",B="B",C="C",1,3,5}
----------------------------
function Factorial(n)
 if n == 0 then   
  return 1  
 else  
  return n*Factorial(n-1)  
 end  
end
然后我们的C代码看起来应该是下面这样.其中注释已经写在代码中就不在啰嗦了.稍稍查下资料就应该明白.

#ifdef __cplusplus
extern "C" 
{
 #endif
 #include "lua.h"
 #include "lualib.h"
 #include "lauxlib.h"
 #ifdef __cplusplus
}
#endif
#include<iostream>
int main(int argc, char* argv[])
{ 
    lua_State* L=luaL_newstate();  
    luaL_openlibs(L);  
    if (luaL_dofile(L,"Test.lua")!=0)  
        std::cout<<"LOAD LUA FILE ERROR"<<std::endl;  
    int nTop=lua_gettop(L);
    lua_getglobal(L,"T1");//全局表T1入栈
    size_t i=1 ;
    while(i<=lua_objlen(L,-1))
    {
        lua_rawgeti(L,-1,i++);//获取T1中第i个元素的值
        std::cout<<lua_tointeger(L,-1)<<" "; 
        lua_pop(L,1);
    }
    lua_getglobal(L,"T2");//全局表T2入栈
    lua_getfield(L,-1,"A");//获取标准Key="A"的Value
    std::cout<<"\nT[\"A\"]="<<lua_tostring(L,-1)<<std::endl;
    lua_pop(L,1);
    lua_pushnil(L);
    while(lua_next(L,-2))
    {
        lua_pushvalue(L,-2);//复制一份Key,因为lua_tostring会将栈中的key也转化为String影响下一次遍历
        std::cout<<lua_tostring(L,-2)<<":"<<lua_tostring(L,-1)<<std::endl;
        lua_pop(L,2);//把栈顶的值移出栈,让key成为栈顶以便继续遍历
    }
    lua_getglobal(L,"Factorial");//把Factorial函数放入栈中  
    lua_pushnumber(L,5);//将Factorial函数需要的参数压栈  
    lua_call(L,1,1);//调用函数.第二个参数表示函数的参数个数.第三个参数表示函数返回值的个数  
    std::cout<<lua_tonumber(L,-1)<<std::endl;
    lua_settop(L,nTop);
    return 0;
}
本人郑重声明如下 一、本文来自CSDN博客网.O传送门:http://BlOG.CSDN.NET/Yirancpp 二、All Rights Reserved. 任何个人或网站转载本文时不得移除本声明. 三、不得对文章进行修改,除非明确说明.同时欢迎大家评论转载和分享.
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页