Lua指令碼調用C函數小結
Lua指令碼調用C函數小結
仔細的學習了一下,發現功能的確非常強大。用指令碼調用C的函數,都希望有如下特性:
1. 多輸出
Lua 本身就支援函數返回多個值,文法如下:
x,y = testext.Test()
2. 可以使用類似C的結構的形式輸入輸出
Lua 的Table可以在形式上很好的模仿C的結構,
a = {}
a.i = 101
a.name = "jason"
a.subtable = {}
a.subtable.i = 99
相當於
struct A
{
int i;
string name;
struct subtable
{
int i;
}
}
這個能力一般的指令碼是不具備的。我們的應用中,很多參數都是用結構組織的,
以前使用TCL,就只能讓使用者平鋪的輸入。現在好多了.
輸出也可以,在C的函數中可以返回一個table給Lua指令碼。TCL也可以返回一個Array.
不過給Lua寫C函數太痛苦了,全部是基於堆棧的,而且非常的不直觀,看來還需要
研究一下如何封裝。網上有不少基於模版的封裝,得好好看看。
測試代碼如下:
Lua
local testlib = package.loadlib("testext.dll","luaopen_testext")
if(testlib)then
testlib()
else
-- Error
end
a = {}
a.i = 101
a.name = "jason hah"
a.subtable = {}
a.subtable.i = 99
r = testext.Complex(a)
print(r.mydata)
C
static int Complex(lua_State* L)
{
//1. get the table from Lua Script
int i = lua_gettop(L);
if( i != 1)
{
lua_pushstring(L, "Complex(table)" ) ;
return 1;
}
if (lua_istable(L, 1))
{
lua_pushstring(L,"i");
lua_gettable(L,-2);
if(lua_isnumber(L,-1))
{
int j = lua_tonumber(L, -1);
printf("The table.j = %d ",j);
}
lua_remove(L,-1);
lua_pushstring(L,"name");
lua_gettable(L,-2);
if(lua_isstring(L,-1))
{
char* name = lua_tostring(L, -1);
printf("The table.name = %s ",name);
}
lua_remove(L,-1);
lua_pushstring(L,"subtable");
lua_gettable(L,-2);
if(lua_istable(L,-1))
{
lua_pushstring(L,"i");
lua_gettable(L,-2);
if(lua_isnumber(L,-1))
{
int j = lua_tonumber(L, -1);
printf("The table.j = %d ",j);
}
}
}
else
{
lua_pushstring(L, "Complex(table)" ) ;
return 1;
}
//2. Return Another table to Lua Script
lua_newtable(L);
lua_pushstring(L, "mydata");
lua_pushnumber(L,66);
lua_settable(L,-3);
return 1;
}