欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > Lua和C++語言的交互詳解

Lua和C++語言的交互詳解

熱門標簽:400手機電話免費辦理 智能語音電銷的機器人 如何利用高德地圖標注家 上海企業(yè)外呼系統(tǒng)排名 武漢百應(yīng)人工智能電銷機器人 揚州電銷外呼系統(tǒng)軟件 電腦外呼系統(tǒng)輻射大嗎 開通400電話申請流程 百度地圖標注位置網(wǎng)站

前言

寫過Windows程序的人都知道,對于應(yīng)用程序,如果需要在本地保存一些配置信息,我們經(jīng)常將這些配置信息寫在注冊表或者本地的配置文件中,很多應(yīng)用都是將一些配置信息寫在配置文件中,比如以ini結(jié)尾的文件,這種配置文件很多,使用的很廣泛,然后應(yīng)用程序在啟動的時候,就會解析這個配置文件,讀取一些配置信息。

Lua的一項重要用途就是作為一種配置語言。而這篇文章將結(jié)合Lua來擴展應(yīng)用程序,這種方式提供了更大的靈活性和便利性。

這篇博文主要總結(jié)的是使用C++和Lua進行交互,涉及到獲取Lua中普通變量的值,Lua中table的值和調(diào)用Lua中的函數(shù)。下面就開始吧。

從一個最簡單的例子開始

一個GUI程序,從配置文件讀取窗口的大小,從而實現(xiàn)設(shè)置窗口的大小。下面我就寫一個基于MFC的窗體程序來完成這個功能。點擊這里去下載完成代碼工程。我把重點的代碼貼出來:

復(fù)制代碼 代碼如下:

bool CLuaConfig::LoadConfig()
{
    L = luaL_newstate();
    if (!L)
    {
        return false;
    }
 
    // 加載配置文件
    int bRet = luaL_loadfile(L, pConfigFile);
    if (bRet)
    {
        return false;
    }
    // 運行配置文件
    bRet = lua_pcall(L, 0, 0, 0);
    if (bRet)
    {
        return false;
    }
 
    // 讀取高
    lua_getglobal(L, "width");
    lua_getglobal(L, "height");
 
    // width
    if (!lua_isnumber(L, -2))
    {
        return false;
    }
 
    // height
    if (!lua_isnumber(L, -1))
    {
        return false;
    }
    iWindowHeight = lua_tointeger(L, -1);
    iWindowWidth = lua_tointeger(L, -2);
    return true;
}

luaL_newstate就不說了,用爛了;luaL_loadfile用于加載一個lua文件,然后調(diào)用lua_pcall運行編譯好的程序塊,lua_pcall是在保護模式下運行Lua代碼,也就是說,出錯了,lua_pcall會返回一個錯誤代碼,并不會直接crash。當運行完程序塊后,調(diào)用了兩次lua_getglobal函數(shù),這個函數(shù)會將全局變量值壓入棧中,所以,width的值在索引為-2的位置,height的值在索引為-1的位置;接下來,就不用多說了。就是這樣。下載程序,運行一下,就OK了,修改代碼文件夾下的config.lua文件,看看運行結(jié)果。源代碼這里下載。

table操作

在Lua中,對于table這種bug一樣存在的東西,如果C API無法操作table,那我們還能不能愉快的玩耍了。讓我們來看看C API如何操作table。現(xiàn)在有如下Lua語句:

復(fù)制代碼 代碼如下:

background = {r = 0.3, g = 1, b = 0.5}

那么,C API如何讀取這段代碼,將其中的每個字段都解析出來呢。我先把代碼貼上來,然后一句一句的分析:

復(fù)制代碼 代碼如下:

// 讀取全局的數(shù)據(jù)到棧中
lua_getglobal(L, "background");
if (!lua_istable(L, -1))
{
    // 如果不是table,就顯示錯誤信息
    cout "It's not a table." endl;
    return 0;
}
 
// 讀取table中字段的值,將值壓入棧中
lua_getfield(L, -1, "r");
 
// 讀取棧中的值
if (!lua_isnumber(L, -1))
{
    // 如果不是實數(shù),就顯示錯誤信息
    cout "It's not a number." endl;
    return 0;
}
 
double fValue = lua_tonumber(L, -1);
cout "r => " fValue endl;

原諒我省略了luaL_newstate這樣的代碼。好了,讀取一個table,同讀取一個全局的變量是一個道理的。分為以下幾步:

1.使用lua_getglobal讀取這個變量,將table讀取到棧中;
2.使用lua_getfield讀取table中字段的值,將字段的值讀取到棧中;
3.使用lua_to*系列函數(shù),將字段的值從棧中讀取出來。

這是讀取table的操作,那設(shè)置table的操作呢?我們可以將我們自己的值寫入到棧中,這該怎么操作?看代碼:

復(fù)制代碼 代碼如下:

// 將需要設(shè)置的值設(shè)置到棧中
lua_pushnumber(L, 0.55);
 
// 將這個值設(shè)置到table中
lua_setfield(L, -2, "r");

就是上面兩行代碼,當然了,你也需要先使用lua_getglobal讀取table變量,將table讀取到棧中,然后按照上面的兩行代碼進行設(shè)置就OK了。上面兩行代碼的具體含義是什么呢?

1.lua_push*系列函數(shù)是將一個需要設(shè)置的新值放到棧中;

2.lua_setfield函數(shù)同lua_getfield是一個性質(zhì)的函數(shù),只不過這里是set語義,將lua_push*到棧中的值,設(shè)置到table對應(yīng)的key中。

現(xiàn)在讀取table,設(shè)置table都說了,那如何在表中完全創(chuàng)建一個新的table呢?我們有這種需求。怎么辦?

復(fù)制代碼 代碼如下:

// 創(chuàng)建一個新的table,并壓入棧
lua_newtable(L);
 
// 往table中設(shè)置值
lua_pushstring(L, "https://www.jb51.net"); // 先將值壓入棧
lua_setfield(L, -2, "website"); // 將值設(shè)置到table中
 
// 再設(shè)置一個值
lua_pushstring(L, "果凍想 | 一個原創(chuàng)文章分享網(wǎng)站");
lua_setfield(L, -2, "description");

我將重要的幾行代碼貼上來了,最重要的就是一個lua_newtable函數(shù),該函數(shù)會創(chuàng)建一個新的table,并將這個table置于棧中,接下來就和上面設(shè)置table的值是一樣的。源代碼下載一、下載二。 

調(diào)用Lua函數(shù)

是的,你沒有看錯,你可以在一lua文件中定義一個函數(shù),然后在C++中調(diào)用這個函數(shù),貌似“高大上”的感覺。現(xiàn)在我就來說說這個“高大上”的功能;習慣性的上代碼:

復(fù)制代碼 代碼如下:

// 再來看看有參數(shù)和返回值得函數(shù)調(diào)用
// 現(xiàn)在在test.lua中定義了一個add函數(shù),計算兩個值的和,這兩個值就是用參數(shù)傳進去的
// 得到和以后,會返回這個和,現(xiàn)在我們就在C++這邊調(diào)用這個add函數(shù)
lua_getglobal(L, "add"); // 獲取函數(shù),壓入棧中
lua_pushnumber(L, 10); // 壓入第一個參數(shù)
lua_pushnumber(L, 20); // 壓入第二個參數(shù)
 
// 完成調(diào)用
iRet = lua_pcall(L, 2, 1, 0);
if (iRet)
{
    const char *pErrorMsg = lua_tostring(L, -1);
    cout pErrorMsg endl;
    lua_close(L);
    return 0;
}
 
// 獲得計算結(jié)果
iRet = lua_isnumber(L, -1);
if (!iRet)
{
    cout "Error occured." endl;
    lua_close(L);
    return 0;
}
 
double fValue = lua_tonumber(L, -1);
cout "Result is " fValue endl;

上面代碼是調(diào)用以下lua函數(shù):

復(fù)制代碼 代碼如下:

-- 有參數(shù),有返回值
function add(iA, iB)
    return iA + iB
end

這個簡單的Lua函數(shù)沒有任何講的地方,說說上面的那一長段C++代碼吧。在Lua中,函數(shù)和普通的值是一樣的,所以,C++調(diào)用Lua中的函數(shù),分為以下幾步:

使用lua_getglobal來獲取函數(shù),然后將其壓入棧;

如果這個函數(shù)有參數(shù)的話,就需要依次將函數(shù)的參數(shù)也壓入棧;

這些準備工作都準備就緒以后,就調(diào)用lua_pcall開始調(diào)用函數(shù)了,調(diào)用完成以后,會將返回值壓入棧中;

最后取返回值得過程不用多說了,調(diào)用完畢。

源代碼這里下載。

總結(jié)

到此這篇文章總結(jié)完畢,總共花費4天的業(yè)余的零碎時間,時間主要花費在demo的編寫上,好了,這篇文章獻上,希望對大家有幫助。如果你覺的還不錯,可以將這篇文章分享給更多的朋友。當然了,你也可以掃描頁面右側(cè)的二維碼資助我寫出更好的文章了,那定是極好的。

您可能感興趣的文章:
  • Lua和C/C++互相調(diào)用實例分析
  • C++利用LuaIntf調(diào)用Lua的方法示例
  • Lua中調(diào)用C++函數(shù)示例
  • 使用Lua來擴展C++程序的方法
  • 把Lua函數(shù)傳遞到C/C++中實例
  • C++與Lua交互原理實例詳解

標簽:宜賓 張掖 新余 嘉峪關(guān) 武漢 延邊 黑龍江 江西

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Lua和C++語言的交互詳解》,本文關(guān)鍵詞  Lua,和,C++,語言,的,交互,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua和C++語言的交互詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Lua和C++語言的交互詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    欧美精品一区二区三区四区| 日韩电影免费在线| 成人小视频在线| 美国黄色特级片| www国产亚洲精品久久麻豆| 免费成人美女在线观看.| 日本护士做爰视频| 91精品国产手机| 图片区小说区区亚洲影院| 人妖粗暴刺激videos呻吟| 欧美日韩在线一区二区| 亚洲国产另类精品专区| 在线精品视频播放| 91精品国产色综合久久ai换脸| 视频一区在线播放| 中文字幕在线观看网址| 精品欧美乱码久久久久久1区2区 | 亚洲av综合色区无码另类小说| 色噜噜夜夜夜综合网| 亚洲少妇30p| 91视频国产观看| 欧美三级电影在线观看| 午夜电影网亚洲视频| 免费a在线观看播放| 精品国产一区二区三区久久久蜜月 | 欧美精品一二三| 亚洲一本大道在线| 国产二级一片内射视频播放| 欧美不卡在线视频| 国产一区日韩二区欧美三区| 久久久99999| 亚洲日本青草视频在线怡红院| 91在线免费看| 欧美精选午夜久久久乱码6080| 日韩av在线发布| 日本乱子伦xxxx| 中文字幕免费不卡| 91捆绑美女网站| 欧美一区二区三区的| 久久99精品久久久久久动态图| 日本成人免费在线观看| 国产精品久久久久久久久久久免费看 | 宇都宫紫苑在线播放| 91精品在线麻豆| 精东粉嫩av免费一区二区三区| 国产免费美女视频| 亚洲永久免费av| 亚洲精品国产精品国自产网站| 欧美激情一区二区三区不卡| wwwxxxx在线观看| 精品对白一区国产伦| 波波电影院一区二区三区| 欧美日韩成人在线| 激情小说亚洲一区| 91黄色免费版| 日本成人在线视频网站| 国产精品久久国产精麻豆96堂| 亚洲激情六月丁香| 国产熟妇久久777777| 亚洲欧洲日产国产综合网| xxxx黄色片| 国产精品短视频| 在线免费观看a级片| 中文字幕欧美三区| 中文字幕 亚洲一区| 国产精品久久久久7777按摩| 国产视频久久久久久| 国产精品三级av| 岛国精品资源网站| 亚洲天堂免费看| 日韩中文字幕有码| 亚洲高清免费观看高清完整版在线观看| 日韩毛片无码永久免费看| 亚洲黄色片在线观看| 97人妻人人揉人人躁人人| 一区二区三区精品视频在线| 欧美黄色高清视频| 五月天中文字幕一区二区| 九九精品视频免费| 美女在线视频一区| 欧美日韩日日骚| 国产成+人+日韩+欧美+亚洲| 91精品国产91综合久久蜜臀| av男人天堂一区| 久久久另类综合| 少妇户外露出[11p]| 一区二区三区波多野结衣在线观看| 国产精品av久久久久久无| 五月婷婷综合网| 欧美最猛性xxxxx直播| 国产精品996| 欧美xxxx老人做受| 国产精品国产三级国产| 国产精品久久久久久在线观看| 中文字幕亚洲精品在线观看| 亚洲精品色午夜无码专区日韩| 亚洲国产一区二区视频| 天天看片中文字幕| 国产福利一区二区三区视频 | 欧美区在线观看| 成人福利视频在线看| 久久久久久久久一| 亚洲精品在线视频免费观看| 亚洲一区欧美一区| 91国偷自产一区二区开放时间 | 亚洲自拍都市欧美小说| 国产免费久久久久| 国产一区二区91| 欧美www视频| 一女三黑人理论片在线| 五月天激情小说综合| 欧美日韩综合色| 91美女蜜桃在线| 中文字幕日本不卡| 五月天激情丁香| 国产成a人无v码亚洲福利| 国产亚洲美州欧州综合国| 亚洲a v网站| 麻豆成人在线观看| 日韩精品中文字幕一区二区三区| 精品中文字幕在线播放| 日韩有码一区二区三区| 欧美一区二区二区| 菠萝菠萝蜜网站| 免费欧美在线视频| 日韩欧美不卡在线观看视频| 给我看免费高清在线观看| 视频一区欧美精品| 91精品久久久久久久99蜜桃| 漂亮人妻被黑人久久精品| 午夜久久久久久电影| 欧美一区二区久久久| 黄色国产在线观看| 美女视频免费一区| 久久麻豆一区二区| 日本不卡一区视频| 成人一区二区三区视频| 亚洲天天做日日做天天谢日日欢| 日本电影亚洲天堂一区| 原创真实夫妻啪啪av| 亚洲v日本v欧美v久久精品| 欧美疯狂性受xxxxx喷水图片| 欧亚乱熟女一区二区在线| 日韩av网站在线观看| 欧美mv和日韩mv国产网站| 欧美极品jizzhd欧美18| 国产91色综合久久免费分享| 最新成人av在线| 欧美三级午夜理伦三级中视频| 美女又爽又黄免费| 国产一区二区在线影院| 一区在线观看视频| 欧美无人高清视频在线观看| 男人的天堂影院| 国产原创一区二区三区| 国产精品沙发午睡系列990531| 色美美综合视频| 伊人网综合视频| 国产一区二区三区四| 亚洲欧洲av色图| 88在线观看91蜜桃国自产| 亚洲精品色午夜无码专区日韩| 成人综合婷婷国产精品久久蜜臀| 亚洲精品国产一区二区精华液| 欧美一区国产二区| www.黄色com| 被黑人猛躁10次高潮视频| 日韩福利视频导航| 香港三级日本三级| 国产毛片精品一区| 一区二区三区四区激情| 欧美电影免费观看高清完整版 | 国产精品免费av| 欧美日韩性生活| 老司机福利在线观看| 91色porny蝌蚪| 久久福利资源站| 亚洲精品视频在线| 精品国产一区二区三区av性色 | 国产宾馆实践打屁股91| 亚洲一区二区美女| 久久精品欧美一区二区三区麻豆| 日本高清无吗v一区| 成人免费av片| 99久久99久久精品免费观看| 日韩国产高清影视| 最新热久久免费视频| 精品蜜桃在线看| 欧美午夜一区二区| 极品尤物一区二区| 国产av一区二区三区传媒| 国产99久久久精品| 日韩国产一二三区| 亚洲日本va在线观看| 亚洲精品在线三区| 欧美日本视频在线| 亚洲色图综合区| 中文字幕 自拍| 中文字幕人妻一区| 成人午夜激情在线|