1. 程式人生 > >C++呼叫lua,lua呼叫C++

C++呼叫lua,lua呼叫C++

//cpp檔案

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <lua5.1/lua.h>
#include <lua5.1/lauxlib.h>
#include <lua5.1/lualib.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

//供lua呼叫的C函式
static int ComWrite(lua_State* L)  
{
    //lua取引數的順序是從右到左
    int interval = luaL_checklong(L, -2);//棧頂第二個元素
    int waitingTime = luaL_checklong(L, -1);//棧頂第一個元素

    printf("interval = %d\twaitingTime = %d\n", interval, waitingTime);
    return 1;
}

unsigned char buf[] = {"hello world"};

int main()
{
    const char *peizhi = "test.lua";
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);

    lua_pushcfunction(L, (lua_CFunction)&ComWrite);  //註冊在lua中使用的c函式
    lua_setglobal(L, "ComWrite");  //繫結到lua中的名字ComWrite

    //載入lua檔案並執行lua檔案
    if (luaL_loadfile(L, peizhi) || lua_pcall(L, 0, 0, 0))
    {
        printf("error..........\n");
        exit(0);
    }

    //將protocol這個變數放在棧頂,對應lua檔案中的protocol這個table
    lua_getglobal(L, "Protocol");
    //如果protocol不是一個table,返回錯誤
    if (!lua_istable(L, -1))
    {
        printf("Protocol is not table\n");
        exit(0);
    }

    //往棧中壓入func,現在func欄位在棧頂
    lua_pushstring(L, "func");
    //把protocol這張表中func對應於的值(f,這是個函式)放在棧頂,彈出func欄位
    lua_gettable(L, -2);
    assert(lua_isfunction(L, -1));
    //壓入f函式的1個行參,
    lua_pushlstring(L, (const char*)buf, sizeof(buf) / sizeof(buf[0]));
    //lua_pcall(L, 2, 1, 0)中的2代表2個形參,1代表1個返回值,如果函式執行正確返回值為0,並且f和形參從棧頂彈出,返回值放在棧頂
    if (lua_pcall(L, 1, 2, 0) != 0)
    {
        printf("error running function func:%s\n", lua_tostring(L, -1));
    }

    lua_pop(L, 1);

    return 0;
}


--lua檔案,名為test.lua

function ParseData(szStr)
    print("szStr = " .. szStr)
    local interval = 1
    local waitingTime = 2
    ComWrite(interval, waitingTime)
end

Protocol =
{
    func = ParseData,
}
return Protocol;