lua和C++交互

lua调用CPP函数

普通参数

int CTest(lua_State* lua)
{
    size_t len;
    //获取字符串参数
    const char* str= lua_tolstring(lua, 1, &len);
    printf("str=%s len=%d\n",str,len);
    //获取数字参数
    int num = lua_tonumber(lua, 2);
    printf("num=%d\n", num);
    //获取bool参数
    bool b = lua_toboolean(lua, 3);
    printf("b=%d\n", b);//1
    return 0;
}
//lua注册函数
lua_register(L, "CTest", CTest);

CTest("hello lua",123,true)

参数是数组

int GetArr(lua_State* lua)
{
    int n = luaL_getn(lua, 1);
    printf("数组长度:%d\n", n);
    for (int i=1;i<=n;i++)
    {
        lua_pushnumber(lua, i);//将index压栈,作为key
        lua_gettable(lua, -2);//把栈顶的index换成元素
        size_t size;
        printf("%s\n", lua_tolstring(lua, -1, &size));//输出栈顶
        lua_pop(lua, 1);//出栈1个
    }
    return 0;
}
lua_register(L, "GetArr", GetArr);

GetArr(Arr)

 

参数是表

//遍历表
int GetAllTable(lua_State* lua)
{
    //先加一个用于弹出
    lua_pushnil(lua);
    //lua_next会弹出一个key,再压入下一个key,压入value
    while (lua_next(lua, 1) != 0)
    {
        printf("%s:", lua_tolstring(lua, -2, NULL));//key
        printf("%s\n", lua_tolstring(lua, -1, NULL));//value
        lua_pop(lua,1);//把value弹出
    }
    return 0;
}
//获取指定元素
int GetTable(lua_State* lua)
{
    lua_pushstring(lua, "Table");//压入key
    lua_gettable(lua, -2);
    lua_pushstring(lua, "name");//压入key
    lua_gettable(lua, -2);//将栈顶作为key,将栈顶换为对应值
    printf("%s\n", lua_tolstring(lua, -1, NULL));
    lua_pop(lua, 1);
    lua_pushstring(lua, "age");
    lua_gettable(lua, -2);
    printf("%s\n", lua_typename(lua, lua_type(lua, -1)));
    printf("%s\n", lua_tolstring(lua, -1, NULL));
    printf("%s\n", lua_typename(lua, lua_type(lua, -1)));
    return 0;
}
//直接获取指定元素
int GetValue(lua_State* lua)
{
    //获取
    lua_getfield(lua, -1, "name");
    if (lua_type(lua,-1) ==LUA_TSTRING)//类型检测
    {
        printf("%s\n", lua_tolstring(lua, -1, NULL));
    }
    else {
        printf("不是string类型");
    }
    
    return 0;
}
lua_register(L, "GetTable", GetTable);
lua_register(L, "GetAllTable", GetAllTable);
lua_register(L, "GetValue", GetValue);
Table={name="airjronda",age=13}
GetAllTable(Table)
Tab={Table=Table}
GetTable(Tab)
GetValue(Table)

 



带返回值

//返回值是string
int TestReturnOne(lua_State* lua)
{
    lua_pushstring(lua, "the value");
    return 1;//返回栈顶元素
}
//返回table
int ReturnTable(lua_State* lua)
{
    lua_newtable(lua);
    lua_pushstring(lua, "name");
    lua_pushstring(lua, "ccc");
    lua_settable(lua, -3);
​
    lua_pushstring(lua, "age");
    lua_pushnumber(lua, 11);
    lua_settable(lua, -3);
​
    return 1;
}
lua_register(L, "TestReturnOne", TestReturnOne);
lua_register(L, "ReturnTable", ReturnTable);

 

local res=TestReturnOne()
print("return:"..res)
local tb2=ReturnTable();
print("name:"..tb2["name"])
print("age:"..tb2["age"])
print(Table["name"])

 

 

Cpp调用lua

读取lua变量

//读取number
void GetWidth(lua_State* lua) {
    lua_getglobal(lua, "width");//获取参数width
    int width = lua_tonumber(lua, -1);//将栈顶转为number
    printf("width=%d", width);
}
//读取table
void GetTableValue(lua_State* lua) {
    lua_getglobal(lua, "conf");
    lua_getfield(lua, -1, "address");
    //if (lua_type(lua, -1) == LUA_TSTRING)//类型检测
    //{
        printf("address=%s\n", lua_tostring(lua, -1));
        //}
    lua_pop(lua,1);
​
    lua_getfield(lua, -1, "password");
    if (lua_type(lua, -1) == LUA_TSTRING)//类型检测
    {
        printf("password=%s\n", lua_tolstring(lua, -1, NULL));
    }
    lua_pop(lua, 1);
​
    lua_getfield(lua, -1, "age");
    if (lua_type(lua, -1) == LUA_TNUMBER)//类型检测
    {
        printf("age=%d\n", lua_tonumber(lua, -1));
    }
    lua_pop(lua, 1);
}

 

width=1920
​
conf={address="123.123.1.23",password="00adsf",age=11}

 

cpp创建全局变量

//创建string变量
lua_pushstring(L, "test");
lua_setglobal(L, "version");//将栈顶设置为全局变量
//cpp给lua创建全局表
void CreateGlobleTable(lua_State* lua) {
    lua_newtable(lua);
    lua_pushstring(lua, "name");
    lua_pushstring(lua, "xiao");
    lua_settable(lua, -3);
    lua_pushstring(lua, "age");
    lua_pushnumber(lua, 12);
    lua_settable(lua, -3);
    lua_pushstring(lua, "tel");
    lua_pushstring(lua, "12312312312");
    lua_settable(lua, -3);//将栈顶为value,栈第二位key,加入表中,-3为表的位置,表弹至栈顶
    lua_setglobal(lua, "Person");
}

 

print("version="..version)
​
print("name="..Person["name"])
print("age="..Person["age"])
print("tel="..Person["tel"])

 

调用方法无参无返回值

lua_State* L = lua_open();
luaL_openlibs(L);
//读取lua脚本
if(luaL_loadfile(L, "K:/main.lua"))
{
    const char *error = lua_tostring(L, -1);
    printf("%s\n", error);
    lua_pop(L, 1);//将错误信息弹出
}
//执行脚本
lua_pcall(L,0,0,0);
//将方法压到栈顶
lua_getglobal(lua, "Event");
//执行lua方法,0参数,0返回值,0错误调用
//成功返回0
if (lua_pcall(L, 0, 0, 0)!=0)
    {
        const char *error = lua_tostring(L, -1);
        printf("%s\n", error);
        lua_pop(L, 1);//将错误信息弹出
}

 

function Event()
print("lua de function")
end

 

调用有参有返回值

void DoLuaEventArgOne(lua_State* lua) {
    lua_getglobal(lua, "Event1");
    lua_pushstring(lua, "arg1");//压入栈顶,参数1。压栈先后为参数顺序
    if (lua_pcall(lua, 1, 1, 0) != 0)
    {
        const char *error = lua_tostring(lua, -1);
        printf("%s\n", error);
        lua_pop(lua, 1);//将错误信息弹出
    }
    else {
        printf("return:%s\n", lua_tostring(lua, -1));//返回值在栈顶
        lua_pop(lua, 1);//将返回值弹出
    }
}

 

function Event1(arg)
print(arg)
return "_res"
end

 

错误调用

int ErrLoc = lua_gettop(lua);//错误调用方法的位置
lua_getglobal(lua, "ErrorFun");
ErrLoc++;
lua_getglobal(lua, "Event");
lua_pcall(lua, 0, 0, ErrLoc);
lua_pop(lua,1);//错误方法出栈

 

function Event()
print("lua de function")
loacl b=1/0
end

 

参数返回值是表

void DoLuaEventTab(lua_State* lua) {
    int ErrLoc = lua_gettop(lua);//错误调用方法的位置
    lua_getglobal(lua, "ErrorFun");
    ErrLoc++;
    lua_getglobal(lua, "Event2");
    //参数是表
    lua_newtable(lua);
    lua_pushstring(lua, "key");
    lua_pushstring(lua, "value");
    lua_settable(lua, -3);
    
    if (lua_pcall(lua, 1, 1, ErrLoc));
    //获取返回值
    lua_getfield(lua, -1, "id");
    printf("res:%d", (int)lua_tonumber(lua,-1));
}

 

function Event2(arg)
print(arg.key)
print(arg["key"])
local t={id=123}
return t
end

 

 
posted @ 2023-11-10 16:42  几个Ak  阅读(19)  评论(0编辑  收藏  举报