C程序與Lua腳本相互調用

  Lua腳本是一種可用於C程序開發/測試的工具,本篇介紹一下C程序與Lua腳本如何進行相互調用,更加詳細的操做參見《Programing in Lua》。本文分爲3個部分:一、Windows環境下Lua的下載以及安裝注意事項;二、Visual C++6.0中Lua的配置;三、C程序與Lua腳本相互調用實例。redis

  一、Windows環境下Lua的下載以及安裝注意事項windows

  a、下載Lua for Windows,筆者用的版本是V5.1.4-35;編輯器

  b、上微軟官網,下載Visual C++運行庫——vcredist_x86.exe
ide

  c、將LuaForWindows_v5.1.4-35.exe和vcredist_x86.exe放在同一目錄下,直接點擊LuaForWindows_v5.1.4-35.exe,安裝便可,建議將Lua安裝在D盤根目錄下;函數

  d、安裝成功以後,使用Lua目錄下SciTE編輯器,就能夠編寫lua腳本,點擊「執行」按鈕,就能夠查看執行結果。工具

  

  二、Visual C++6.0中Lua的配置測試

  a、新建一個工程LuaMutualCallCMethod,選擇Tools--->Options--->Directories,配置VC++的目錄項:google

  (1)Include files,添加「D:\LUA\5.1\INCLUDE」;lua

  (2)Library files,添加「D:\LUA\5.1\LIB」;spa

  (3)Executable files,添加「D:\LUA\5.1」;

  b、配置工程的連接屬性,選擇Project--->Setting---->Link,添加lua5.1.lib;

  三、C程序與Lua腳本相互調用實例

  a、C程序調用Lua腳本

  (1)建立Lua數據腳本data.lua  

length = 5
width = 10
heigth = 20
View Code

  (2)建立C程序main.c,讀取test.lua中的數據,並打印輸出  

#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

void main()
{
    int retCode;
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);
    retCode = luaL_dofile(L,"data.lua");
    if (retCode != 0)
    {
        printf("error %s\n",lua_tostring(L,-1));
        return;
    }
    lua_getglobal(L,"length");
    lua_getglobal(L,"width");
    lua_getglobal(L,"heigth");

    printf("length=%d\n",lua_tointeger(L,-3));
    printf("width=%d\n",lua_tointeger(L,-2));
    printf("heigth=%d\n",lua_tointeger(L,-1));

    lua_close(L);
}
View Code

  (3)輸出結果

      length = 5

      width = 10

      height = 20

 

  b、Lua腳本調用C程序中的函數

  (1)建立Lua執行腳本compute.lua

sum = 0
firstPara = 20
secondPara = 10

sum = addMethod(firstPara,secondPara)

printMethod(sum)
View Code

  (2)建立C程序CMethodForLua.c,編寫與「addMethod」、「printMethod」相對應的C函數,並將其「註冊」到Lua環境中;

#include <stdio.h>
#include "CmethodForLua.h"

/**********************************************************************
    Fuction:        Lua_AddMethod
    Description:    供Lua調用的加法運算

    Parameter:        luaEnv        --[in]    lua執行環境            

    Return Value:    數字    lua執行後返回參數

    Note:            

    Other:            內部函數,僅供CmethodForLua.c調用


 *********************************************************************/
static int Lua_AddMethod(lua_State *luaEnv)
{
    double firstPara = luaL_checknumber(luaEnv,1);
    double secondPara = luaL_checknumber(luaEnv,2);
    lua_pushnumber(luaEnv,firstPara+secondPara);
    return 1;
}

/**********************************************************************
    Fuction:        Lua_PrintMethod
    Description:    供Lua調用的打印運算

    Parameter:        luaEnv        --[in]    lua執行環境            

    Return Value:    數字    lua執行後返回參數

    Note:            

    Other:            內部函數,僅供CmethodForLua.c調用


 *********************************************************************/
static int Lua_PrintMethod(lua_State *luaEnv)
{
    int printData = (int)luaL_checknumber(luaEnv,1);
    printf("The Print Data is %d\n",printData);
    return 0;
}


/**********************************************************************
    Fuction:        OpenLuaExecuteEnvironment
    Description:    打開Lua執行環境

    Parameter:        luaEnv        --[in/out]    lua執行環境    

    Return Value:    0    執行成功
                    非0    執行失敗,錯誤碼

    Note:            
    一、建立Lua狀態;
    二、打開Lua標準庫
    三、註冊供Lua調用的C函數;

    Other:            


 *********************************************************************/
int OpenLuaExecuteEnvironment(lua_State **luaEnv)
{
    lua_State *L = NULL;
    L = luaL_newstate();
    luaL_openlibs(L);
    lua_register(L,"addMethod",Lua_AddMethod);
    lua_register(L,"printMethod",Lua_PrintMethod);
    *luaEnv = L;
    return LUA_SUCCESS;
}

/**********************************************************************
    Fuction:        CloseLuaExecuteEnvironment
    Description:    關閉Lua執行環境

    Parameter:        luaEnv        --[in]    lua執行環境    

    Return Value:    0    執行成功
                    非0    執行失敗,錯誤碼

    Note:            

    Other:            


 *********************************************************************/
int CloseLuaExecuteEnvironment(lua_State *luaEnv)
{
    lua_close(luaEnv);
    return LUA_SUCCESS;
}
View Code

  (3)建立main.c,獲取CMethodForLua.c中的Lua執行環境,並執行compute.lua腳本

#include <stdio.h>
#include "CmethodForLua.h"

void main()
{
    lua_State *luaEnv = NULL;
    int retCode;
    retCode = OpenLuaExecuteEnvironment(&luaEnv);
    if (retCode != LUA_SUCCESS)
    {
        return;
    }
    
    //Lua調用C語言函數,    
    retCode = luaL_dofile(luaEnv,"compute.lua");
    if (retCode != LUA_SUCCESS)
    {
        printf("error %s\n",lua_tostring(luaEnv,-1));
        return;
    }

    CloseLuaExecuteEnvironment(luaEnv);
}
View Code

  (4)輸出結果

    The Print Data is 30

相關文章
相關標籤/搜索