lua 与 c/c++ 交互(6) lua调用C++(使用数组 和字符串函数)

时间:2022-09-22 09:38:33

lua调用 c++ 的 两个函数: 一个是 对lua 数组 调用函数替换 数组元素,一个 分割字符串

test.lua

--数组操作
a = {1,2,3,4,5,6}
swapArray(a,function(t)
return t + 1
end)

local function printArray(array)
for k,v in ipairs(array) do
print(k,"\t",v,"\n")
end
end

printArray(a)

--分割字符串
a = split("a,b,c,d,e,fgh,ijk",",")
printArray(a)

cpp

// LuaCApi.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string>
using namespace std;
extern "C"{
#include "lua\lua.h"
#include "lua\lauxlib.h"
#include "lua\lualib.h"
}

void error(lua_State * l,const char * fmt,...){
va_list va;
va_start(va,fmt);
vfprintf(stderr,fmt,va);
va_end(va);
lua_close(l);
exit(EXIT_FAILURE);
}


int swapArray(lua_State *l){
luaL_checktype(l,1,LUA_TTABLE);
luaL_checktype(l,2,LUA_TFUNCTION);
int len = lua_objlen(l,1);
for (int i = 1; i <= len; i++)
{
lua_pushvalue(l,2);
lua_rawgeti(l,1,i);
if (lua_pcall(l,1,1,0))
{
printf("error :%s",lua_tostring(l,-1));
}
lua_rawseti(l,1,i);
}
return 0;
}

int split(lua_State *l){
const char * s = luaL_checkstring(l,1);
const char * sep = luaL_checkstring(l,2);
const char * index = NULL;
int count = 1;
lua_newtable(l);
while ((index = strchr(s,*sep)) != NULL)
{
lua_pushlstring(l,s,index-s);
lua_rawseti(l,-2,count++);
s = index + 1;
}
lua_pushstring(l,s);
lua_rawseti(l,-2,count);
return 1;

}

int _tmain(int argc, _TCHAR* argv[])
{
lua_State * l = luaL_newstate();
luaL_openlibs(l);
lua_register(l,"swapArray",swapArray);
lua_register(l,"split",split);
if (luaL_loadfile(l,"test.lua") || lua_pcall(l,0,0,0))
{
error(l,"error : %s",lua_tostring(l,-1));
}

return 0;
}