最近在看lua,覺得很有趣,發(fā)現(xiàn)沒有最新版本的例子,所以自己就別人的博客里弄了源碼,然后改成最新版本的lua C API.
關(guān)于lua非常基礎(chǔ)的就不介紹了,咱們就從簡單的測試開始吧。
在此之前如果沒有搭好lua在win32下的環(huán)境
1.C/C++執(zhí)行l(wèi)ua腳本
我只是用改用了最新的lua的C API。不多說,直接上代碼
#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};using namespace std;int main(){lua_State *pLuaState = luaL_newstate();/*載入lua基本庫*/luaL_openlibs(pLuaState);//luaopen_base(pLuaState);//luaopen_io(pLuaState); //替換老版本的lua_iolibopen(pLuaState);//luaopen_string(pLuaState); //替換老版本的lua_strlibopen(pLuaState);//luaopen_math(pLuaState); //替換老版本的lua_mathlibopen(pLuaState);//luaopen_debug(pLuaState); //替換老版本的lua_dblibopen(pLuaState);/*運行腳本*/luaL_dofile(pLuaState,"./script/hw.lua");/*清除lua*/ lua_close(pLuaState);/*暫停*/cout<<"Press enter to exit…"<<endl;getchar();return 0;}hw.lua的源碼:
print("Hello Word!");這個例子只是簡單的執(zhí)行了一個lua腳本。
其中:lua_newstate是核心函數(shù),要求提供內(nèi)存分配函數(shù),luaL_newstate是輔助庫函數(shù),采用默認的內(nèi)存分配函數(shù)。lua_open是5.0時代的產(chǎn)物,5.1是luaL_newstate的宏,5.2里面已經(jīng)沒有了。
2.C/C++調(diào)用lua函數(shù)
話不多說,直接上代碼
#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};using namespace std;/************************************************************************///函數(shù)功能:調(diào)用lua函數(shù)//函數(shù)參數(shù):// L lua虛擬機// x// y//函數(shù)返回:// sum//核心函數(shù) lua_call()/*調(diào)用一個函數(shù)。要調(diào)用一個函數(shù)請遵循以下協(xié)議: 首先,要調(diào)用的函數(shù)應(yīng)該被壓入堆棧; 接著,把需要傳遞給這個函數(shù)的參數(shù)按正序壓棧;這是指第一個參數(shù)首先壓棧。 最后調(diào)用一下 lua_call; nargs 是你壓入堆棧的參數(shù)個數(shù)。 當(dāng)函數(shù)調(diào)用完畢后,所有的參數(shù)以及函數(shù)本身都會出棧。而函數(shù)的返回值這時則被壓入堆棧。 返回值的個數(shù)將被調(diào)整為 nresults 個, 除非 nresults 被設(shè)置成 LUA_MULTRET。在這種情況下,所有的返回值都被壓入堆棧中。 Lua 會保證返回值都放入棧空間中。函數(shù)返回值將按正序壓棧(第一個返回值首先壓棧), 因此在調(diào)用結(jié)束后,最后一個返回值將被放在棧頂。被調(diào)用函數(shù)內(nèi)發(fā)生的錯誤將(通過 longjmp)一直上拋。*//************************************************************************/int luaadd(lua_State *L, int x, int y){int sum;/*通過名字獲取Lua函數(shù)*/lua_getglobal(L,"add");/*向棧中壓入第一個參數(shù)*/lua_pushnumber(L,x);/*向棧中壓入第二個參數(shù)*/lua_pushnumber(L,y);/*調(diào)用函數(shù)*/lua_call(L,2,1);/*得到結(jié)果把給定索引處的 Lua 值轉(zhuǎn)換為 lua_Integer 這樣一個有符號整數(shù)類型。這個 Lua 值必須是一個數(shù)字或是一個可以轉(zhuǎn)換為數(shù)字的字符串,否則,lua_tointeger 返回 0 。*/sum = (int)lua_tointeger(L,-1);/*從堆棧中彈出 n 個元素*///nlua_pop(L,1);return sum;}int main(){int sum;/*初始化lua虛擬機*/lua_State *L = luaL_newstate();/*載入lua基本庫*/luaL_openlibs(L);/*載入腳本*/luaL_dofile(L,"./script/test.lua");/*調(diào)用lua函數(shù)*/sum = luaadd(L,10,15);/*顯示結(jié)果*/cout<<"The sum = "<<sum<<endl;/*清除lua虛擬機*/lua_close(L);/*顯示結(jié)果并暫停*/cout<<"Press enter to exit…"<<endl;getchar();return 0;}test.lua代碼為:
function add(x,y)return x + y;end
其中關(guān)于lua的堆棧問題,目前我還沒有了解,希望大家多多指教。
3.lua調(diào)用C/C++函數(shù)
代碼為:
#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};using namespace std;static int average(lua_State *L){/*得到參數(shù)個數(shù)*/int n = lua_gettop(L);/*定義和*/double sum = 0;/*循環(huán)變量*/int i;/*循環(huán)取值求和*/for (i = 1; i <= n; i++){sum += lua_tonumber(L,i);//cout<<sum<<endl;}//cout<<"fffffff"<<endl;/*壓入平均值*/lua_pushnumber(L,sum/n);/*壓入和*/lua_pushnumber(L,sum);/*返回返回值個數(shù)*/return 2;}int main(){/*初始化Lua虛擬機*/lua_State *L = luaL_newstate();/*打開lua基本庫*/luaL_openlibs(L);/*注冊函數(shù)*/lua_register(L,"average",average);/*運行腳本*/luaL_dofile(L,"./script/avg.lua");/*清除lua虛擬機*/lua_close(L);/*打印暫停*/cout<<"Press enter to exit…"<<endl;getchar();return 0;}avg.lua源碼為:
function main()local avg,sum = average(2,2,2,2,2);print("The avg is",avg);print("The sum is", sum);endmain();新聞熱點
疑難解答
圖片精選