人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

lua 基礎(chǔ)教程

發(fā)布日期:2022-01-31 08:25 | 文章來源:源碼之家

最近在看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();

國外服務(wù)器租用

版權(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處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部