Lua指令碼調用C函數小結

來源:互聯網
上載者:User

 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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.