C語言調用Lua

1、首先是準備Lua庫,官方提供了5.1版庫,可是因爲官方的失誤,致使存在2個dll文件,缺一不可,大麻煩。 less

好在Lua是開源的,咱們能夠本身編譯。參看:http://my.oschina.net/u/580100/blog/108468 函數

2、而後準備Lua代碼文件,本身隨便寫個吧,好比下面這個求階乘:test.lua lua

function func1 (n)
	if n == 0 then
		return 1
	else
		return n * func1 (n - 1)
	end
end


3、具體在C語言中調用的細節以下: spa

一、包含頭文件 .net

#include "Lua\Lua.h"
#include "Lua\LuaLib.h"
#include "Lua\LauxLib.h"
二、建立 Lua 庫指針,並加載庫
    pLua = luaL_newstate();                     /* 建立Lua接口指針 */
    if(pLua == NULL)
        return 0;
    luaL_openlibs(pLua);                        /* 加載Lua庫 */
三、讀取 Lua 代碼文件
    if(luaL_loadfile(pLua, "test.lua") != 0)    /* 讀取lua源文件,僅載入內存而未編譯 */
        return 0;
    lua_pcall(pLua, 0, LUA_MULTRET, 0);         /* 執行匿名函數,以編譯源代碼成二進制碼 */
                                                /* 並將全局變量壓棧(函數名也是變量)。*/
                                                /* 這句看似無用,可是不能省 */
    lua_getglobal(pLua, "func1");               /* 取全局變量,這裏是待調用函數名 */
四、調用函數,完成功能
    lua_pushnumber(pLua, x);                    /* 參數壓棧。x 爲事先定義的變量 */
    if(lua_pcall(pLua, 1, 1, 0) != 0)           /* 執行函數 */
    {
        printf("\nError running function 'func1' : %s", lua_tostring(pLua, -1));
        return 0;
    }
    r = lua_tonumber(pLua, -1);                 /* 取棧頂值,並轉成數字格式。r 爲事先定義的變量 */
    lua_pop(pLua, 1);                           /* 棧頂彈出一個元素,即清除返回值佔用的棧空間 */
這裏值得一提的是 函數 lua_pcall 的參數,第二個是參數個數,第三個是返回值個數,第四個是個函數指針,咱們始終置0。


五、最後記得清理 指針

lua_close(pLua);


再把完整代碼貼上:
#include <stdio.h>
#include <stdlib.h>
#include <Lua\Lua.h>
#include <Lua\LuaLib.h>
#include <Lua\LauxLib.h>


int main()
{
    int x;
    long int r;
    lua_State *pLua;

    pLua = luaL_newstate();                     /* 建立Lua接口指針 */
    if(pLua == NULL)
        return 0;
    luaL_openlibs(pLua);                        /* 加載Lua庫 */

    if(luaL_loadfile(pLua, "test.lua") != 0)    /* 讀取lua源文件,僅載入內存而未編譯 */
        return 0;
    lua_pcall(pLua, 0, LUA_MULTRET, 0);         /* 執行匿名函數,以編譯源代碼成二進制碼,*/
                                                /* 並將全局變量壓棧(函數名也是變量) */
    lua_getglobal(pLua, "func1");               /* 取全局變量,這裏是待調用函數名 */

    printf("Enter a number (less than 13) : ");
    scanf("%d", &x);

    lua_pushnumber(pLua, x);                    /* 參數壓棧 */
    if(lua_pcall(pLua, 1, 1, 0) != 0)           /* 執行函數 */
    {
        printf("\nError running function 'func1' : %s", lua_tostring(pLua, -1));
        return 0;
    }
    r = lua_tonumber(pLua, -1);                 /* 取棧頂值,並轉成數字格式 */
    lua_pop(pLua, 1);                           /* 棧頂彈出一個元素,即清除返回值佔用的棧空間 */

    printf("%d! = %ld", x, r);
    lua_close(pLua);
    return 0;
}
相關文章
相關標籤/搜索