婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Lua教程(二):C++和Lua相互傳遞數(shù)據(jù)示例

Lua教程(二):C++和Lua相互傳遞數(shù)據(jù)示例

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

這是我的Lua系列教程的第二篇,本篇文章主要介紹C++和Lua相互傳遞數(shù)據(jù)。如果你還不知道怎么在c/c++里面調(diào)用Lua腳本的話,請參考這篇文章. 本文主要介紹基本數(shù)據(jù)類型的傳遞,比如整形(int),字符串(string)、數(shù)字(number)及bool值。

加載并運行Lua腳本

由于在上一個教程里面已經(jīng)介紹過如何在C/C++里面嵌入Lua,所以這一節(jié)就簡單的介紹一下程序怎么用,配置就略過啦。

創(chuàng)建Lua虛擬機

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

lua_State *lua_state = luaL_newstate();

加載Lua庫

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

static const luaL_Reg lualibs[] =
    {
        {"base", luaopen_base},
        {"io", luaopen_io},
        {NULL, NULL}
    };
    const luaL_Reg *lib = lualibs;
    for(; lib->func != NULL; lib++)
    {
        luaL_requiref(lua_state, lib->name, lib->func, 1);
        lua_pop(lua_state,1);
    }

運行Lua腳本

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

std::string scriptPath = FileUtils::getInstance()->fullPathForFilename("hello.lua");
int status = luaL_loadfile(lua_state, scriptPath.c_str());
std::cout " return: " status std::endl;
int result = 0;
if(status == LUA_OK)
{
    result = lua_pcall(lua_state, 0, LUA_MULTRET, 0);
}
else
{
    std::cout " Could not load the script." std::endl;
}

這里我們使用的是luaL_loadfile而不是之前的luaL_dofile,其實luaL_dofile只是一個宏定義:

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

#define luaL_dofile(L, fn) \
    (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))

我們先調(diào)用luaL_loadfile可以判斷Lua腳本是否加載成功,然后再調(diào)用lua_pcall來執(zhí)行Lua腳本。

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

首先,我們在hello.lua里面定義一個lua函數(shù):

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

-- add two numbers
function add ( x, y )
    return x + y
end

Lua的函數(shù)定義是以function為keyword,然后以end結(jié)尾,同時它的參數(shù)是沒有形參類型的,另外,Lua的函數(shù)可以返回多個值。不過我們這里只返回了一個值。

接下來,讓我們看看如果在C++程序里面調(diào)用這個函數(shù):

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

int luaAdd(lua_State *lua_state , int x, int y)
{
    int sum;
    //獲取lua里面的add函數(shù)并把它放到lua的棧頂
    lua_getglobal(lua_state, "add");
    //往lua棧里面壓入兩個參數(shù)
    lua_pushnumber(lua_state, x);
    lua_pushnumber(lua_state, y);
    //調(diào)用lua函數(shù),這里的2是參數(shù)的個數(shù),1是返回值的個數(shù)
    lua_call(lua_state, 2, 1);
    //從棧頂讀取返回值,注意這里的參數(shù)是-1
    sum = lua_tointeger(lua_state, -1);
    //最后我們把返回值從棧頂拿掉
    lua_pop(lua_state, 1);
    return sum;
}

然后,我們就可以在程序里面調(diào)用它了:

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

std::cout "2 + 1= " luaAdd(lua_state,4,1)std::endl;

注意這個方法調(diào)用要在lua_pcall調(diào)用之后。

操作Lua全局變量

C++里面獲取Lua全局變量的值

首先,我們在hello.lua里面定義一個全局變量

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

myname = "子龍山人"

然后我們在C++里面訪問它:

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

lua_getglobal(lua_state, "myname");
std::string myname = lua_tostring(lua_state, -1);
lua_pop(lua_state, 1);
std::cout"Hello: "mynamestd::endl;

這一次我們又是通過lua_getglobal來把myname這個全局變量壓到lua棧,然后用lua_tostring來取這個值。

C++里面修改Lua全局變量的值

這次我們使用的是lua_setglobal來傳遞數(shù)據(jù)給Lua:

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

lua_pushstring(lua_state, "World");
    lua_setglobal(lua_state, "myname");

這時,我們只要在hello.lua的最開始部分,調(diào)用print(myname)就可以打印傳遞進來的值了。

C++傳遞Table給Lua

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

lua_createtable(lua_state, 2, 0);
    lua_pushnumber(lua_state, 1);
    lua_pushnumber(lua_state, 49);
//    lua_settable(lua_state, -3);
    lua_rawset(lua_state, -3);
    lua_pushnumber(lua_state, 2);
    lua_pushstring(lua_state, "Life is a beach");
//    lua_settable(lua_state, -3);
    lua_rawset(lua_state, -3);
    lua_setglobal(lua_state, "arg");

這里我們傳遞了一個table給lua,這個table為{49,”Life is a beach”}。Lua table的索引是從1開始的,然后我們在lua腳本里面可以這樣子來訪問這個table:

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

for i=1,#arg do
    print("      ", i, arg[i])
end

這里的#arg是獲得table的長度,然后使用arg[i]來獲取table的索引i處的value。

Lua返回多個值給C++

首先是Lua代碼:

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

local temp = {9, "hehehej"}
-- temp[1]=9
-- temp[2]="See you space cowboy!"
return temp,9,1

然后是C++代碼:

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

std::stringstream str_buf;
    while(lua_gettop(lua_state))
    {
        str_buf.str(std::string());
        str_buf " ";
        switch(lua_type(lua_state, lua_gettop(lua_state)))
        {
            case LUA_TNUMBER:
                str_buf "script returned the number: "
                lua_tonumber(lua_state, lua_gettop(lua_state));
                break;
            case LUA_TTABLE:
                str_buf "script returned a table";
                break;
            case LUA_TSTRING:
                str_buf "script returned the string: "
                lua_tostring(lua_state, lua_gettop(lua_state));
                break;
            case LUA_TBOOLEAN:
                str_buf "script returned the boolean: "
                lua_toboolean(lua_state, lua_gettop(lua_state));
                break;
            default:
                str_buf "script returned an unknown-type value";
        }
        lua_pop(lua_state, 1);
        std::cout str_buf.str() std::endl;
    }

最后輸出結(jié)果為:

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

[C++] Values returned from the script:
 script returned the number: 1
 script returned the number: 9
 script returned a table
[C++] Closing the Lua state

在lua里面return值的順序是table,9,1,而在C++里面是倒過來的。因為我們是使用棧作為數(shù)據(jù)結(jié)構(gòu)來傳遞數(shù)據(jù),而棧是先進后出的。

下一篇文章,我們將介紹一下C++調(diào)用Lua的Table。

您可能感興趣的文章:
  • Lua教程(五):C/C++操作Lua數(shù)組和字符串示例
  • Lua教程(四):在Lua中調(diào)用C語言、C++的函數(shù)
  • Lua教程(三):C語言、C++中調(diào)用Lua的Table示例
  • Lua教程(一):在C++中嵌入Lua腳本
  • Lua教程(六):綁定一個簡單的C++類

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua教程(二):C++和Lua相互傳遞數(shù)據(jù)示例》,本文關(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++和Lua相互傳遞數(shù)據(jù)示例》相關(guān)的同類信息!
  • 本頁收集關(guān)于Lua教程(二):C++和Lua相互傳遞數(shù)據(jù)示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产在线精品免费av| 欧美疯狂性受xxxxx喷水图片| 欧美人体做爰大胆视频| 久久久久久亚洲综合影院红桃| 国产91对白在线观看九色| 中文字幕一区二区三区色视频| 91亚洲精品久久久蜜桃| 亚洲国产日韩精品| 精品国产乱码久久久久久蜜臀 | 国产亚洲精品免费| 色综合欧美在线| 蜜臀av亚洲一区中文字幕| 国产精品视频一区二区三区不卡| 丰满少妇久久久久久久 | 欧美国产视频在线| 在线亚洲+欧美+日本专区| 国产酒店精品激情| 成人性视频网站| 麻豆freexxxx性91精品| 免费高清在线视频一区·| 亚洲欧美日韩电影| 欧美精品一区二区在线观看| 日韩免费高清电影| 在线一区二区视频| www.激情成人| 国产精品影视在线观看| 成人性生交大片免费看视频在线| 久久99精品久久久久久国产越南 | 91精品国产综合久久精品麻豆| 成人综合在线观看| 亚洲18影院在线观看| 天堂va蜜桃一区二区三区漫画版 | 精品成a人在线观看| 欧美精品一卡二卡| 欧美日韩一区二区三区在线看| 7777精品久久久大香线蕉| 欧美四级电影在线观看| 欧美日韩在线播放一区| 国产专区欧美精品| jlzzjlzz亚洲女人18| 国产传媒久久文化传媒| 国产精品中文字幕日韩精品| 精品一区二区三区在线观看国产| 国产一区二区0| 国产专区综合网| 国模少妇一区二区三区| 一区二区三区精品| 一区二区三区日本| 亚洲一区二区四区蜜桃| 五月综合激情婷婷六月色窝| 性久久久久久久久久久久| 国产精品亚洲一区二区三区妖精| 国产美女一区二区| 成人美女在线视频| 91社区在线播放| 欧美在线|欧美| 欧美妇女性影城| 精品剧情在线观看| 亚洲五码中文字幕| 美女一区二区三区在线观看| 天天操天天干天天综合网| 国产精品久久久久天堂| 蜜桃视频在线一区| 黑人精品欧美一区二区蜜桃 | 日本不卡一区二区三区高清视频| 韩国欧美国产1区| fc2成人免费人成在线观看播放| 91丝袜美腿高跟国产极品老师| 国产成人免费在线视频| 欧美亚洲一区二区在线观看| 欧美日韩一区小说| 一区二区三区免费在线观看| 亚洲6080在线| 日本亚洲欧美天堂免费| 99久久精品免费看| 欧美精品一二三区| 国产免费成人在线视频| 日韩av一二三| 国产很黄免费观看久久| 91国产视频在线观看| 精品成a人在线观看| 天堂成人国产精品一区| 成人午夜在线播放| 欧美午夜精品一区二区蜜桃| 欧美精品日韩精品| 亚洲精品第一国产综合野| 久久精品国产精品青草| 色婷婷综合在线| 日韩精品一区在线| 一区二区三区欧美| 国产福利精品一区二区| 中文字幕一区三区| 欧美精品一区二| 亚洲一级二级三级在线免费观看| 国产成人亚洲综合a∨猫咪 | 成人免费视频免费观看| 日韩一卡二卡三卡四卡| 一区二区三区在线视频观看58| 亚洲成精国产精品女| 99久久精品99国产精品 | 欧美四级电影在线观看| 一区二区三区在线免费视频| 国产成人av一区二区| 在线不卡欧美精品一区二区三区| 亚洲电影一级片| 色综合视频一区二区三区高清| 久久久精品国产99久久精品芒果| 日本一区二区三区高清不卡| 久久精品国产77777蜜臀| 欧美三级一区二区| 尤物在线观看一区| 8x8x8国产精品| 亚洲国产裸拍裸体视频在线观看乱了| 成人免费视频app| 欧美日韩免费一区二区三区 | 久久99久久久久久久久久久| 色狠狠综合天天综合综合| 最新日韩在线视频| 5566中文字幕一区二区电影| 日韩电影在线观看一区| 亚洲国产经典视频| 成人在线综合网站| 欧美午夜寂寞影院| 欧美一区二区三区在线看| 麻豆久久久久久久| 欧美精品tushy高清| 国产中文字幕一区| 亚洲人吸女人奶水| 欧美一区二区三区喷汁尤物| 国产精品中文有码| 亚洲女性喷水在线观看一区| 欧美精品丝袜久久久中文字幕| 国产精品一品视频| 香蕉影视欧美成人| 久久综合色之久久综合| 欧美在线999| 国产精品白丝jk黑袜喷水| 亚洲制服欧美中文字幕中文字幕| 337p粉嫩大胆色噜噜噜噜亚洲 | 久久精品视频一区| 欧美午夜精品理论片a级按摩| 美日韩黄色大片| 玉米视频成人免费看| 国产欧美综合在线| 欧美成人一区二区三区| 成人高清免费观看| 五月激情综合网| 国产精品成人免费在线| 51精品久久久久久久蜜臀| 91蝌蚪porny九色| 国产老妇另类xxxxx| 婷婷国产v国产偷v亚洲高清| 一区精品在线播放| 中文字幕乱码久久午夜不卡| 色噜噜狠狠色综合欧洲selulu | 欧美日韩一区二区电影| 国产精品一区二区久激情瑜伽 | 国产欧美一区视频| 91精品国产91综合久久蜜臀| 99九九99九九九视频精品| 经典三级在线一区| 亚洲v日本v欧美v久久精品| 中文字幕亚洲在| 中文成人av在线| 欧美精品一区二区三区在线播放| 欧美一区二区播放| 一本到三区不卡视频| 国产成人精品一区二区三区四区| 激情五月播播久久久精品| 日本视频一区二区三区| 亚洲三级电影网站| 亚洲乱码中文字幕综合| 亚洲欧美激情一区二区| 亚洲免费视频中文字幕| 亚洲欧洲www| 综合激情成人伊人| 久久久综合视频| 精品1区2区在线观看| 日韩欧美亚洲国产精品字幕久久久| 欧美日韩高清一区二区三区| 欧美裸体bbwbbwbbw| 欧美一区二区免费观在线| 色婷婷久久一区二区三区麻豆| 国产69精品久久久久毛片| 风间由美一区二区av101| 不卡电影免费在线播放一区| 成人深夜在线观看| 99国产一区二区三精品乱码| 91美女在线看| 日本高清成人免费播放| 欧洲av在线精品| 日韩欧美一卡二卡| 久久久激情视频| 亚洲裸体xxx| 婷婷一区二区三区| 国产精品一区二区男女羞羞无遮挡| 国产精品18久久久久| 成人动漫一区二区在线| 色婷婷综合久色| 欧美日韩亚洲综合在线 |