lua 基礎(chǔ)教程
最近在看lua,覺得很有趣,發(fā)現(xiàn)沒有最新版本的例子,所以自己就別人的博客里弄了源碼,然后改成最新版本的lua C API.
關(guān)于lua非常基礎(chǔ)的就不介紹了,咱們就從簡單的測試開始吧。
在此之前如果沒有搭好lua在win32下的環(huán)境,請看 https://www.jb51.net/article/61451.htm
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 個元素*/ //n lua_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); end main();
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。