Lua與C交互-訪問(wèn)Lua變量(原創(chuàng))

1柜裸、交互原理

一個(gè)Lua程序與C的交互都是通過(guò)Lua虛擬機(jī)中的一個(gè)堆棧進(jìn)行的缕陕,通過(guò)調(diào)用Lua C API可以讓C中的值入棧再出棧賦值給Lua ,也可以讓Lua值入棧再出棧賦給C疙挺。

Lua的8種基本類型:nill扛邑、boolean、number铐然、string蔬崩、userdata、function锦爵、thread舱殿、table,? Lua C API 都提供相應(yīng)的操作接口。

Lua C API 具體閱讀lua.h险掀、lualib.h沪袭、lauxlib.h頭文件。

2、一些基礎(chǔ)概念

?? Lua_State ?? :? 一個(gè)Lua_State管理著Lua虛擬機(jī)的一個(gè)執(zhí)行環(huán)境冈绊,擁有獨(dú)立的數(shù)據(jù)棧和調(diào)用棧幻妓,表示一個(gè)Lua程序的執(zhí)行狀態(tài)灵临。

?Lua虛擬棧: lua虛擬機(jī)中的用來(lái)實(shí)現(xiàn)lua與C交互的棧济竹,棧都是先進(jìn)后出的惋啃,我們對(duì)棧的操作都是基于棧頂?shù)模簿褪钦f(shuō)如果要獲取到棧底元素毅该,需要將其上面的依次彈出博秫。虛擬棧的索引方式有兩種,正索引和負(fù)索引眶掌,正索引(1-N)挡育, 負(fù)索引((-N)-(-1))。

3朴爬、訪問(wèn)Lua變量實(shí)現(xiàn)

??我這邊使用的是vs建立的c++工程即寒。

?新建一個(gè)main.lua文件,并敲入如下代碼:

?var1 = 5

print(“this is in lua \n”)

在C++源文件中,先導(dǎo)入需要的頭文件: ?

#include? <windows.h> ? ?? //系統(tǒng)的頭文件召噩,我們?cè)诤竺鏁?huì)用到一個(gè)系統(tǒng)的方法需要

extern "C" {

? #include <lua.h>

?#include <lualib.h>

? #inlude <lauxlib.h>

}

定義一個(gè)獲取lua變量的函數(shù):

void get_luaVar(lua_State *L){

? ? ? ? int ?? lua_var;

? ? ? ? lua_getglobal(L, "var1"); ? ? ? ? ? ? ? ? ? ?? //從lua變量空間將var1變量放入棧中

? ? ?? if (!lua_isnumber(L, -1)) ? ? ? ? ? ? ? ? ? ? ?? // 通常需要對(duì)棧中元素類型做下檢測(cè)

? ? ?? printf("is not number");

? ? ?? lua_var = lua_tonumber(L, -1); ? ? ? // 從棧中讀取剛才壓入的變量母赵,此時(shí)并不會(huì)將變量出棧

? ? ?? printf("讀取lua中var1變量的值? %d\n\n", lua_var);

}

定義一個(gè)設(shè)置lua變量的函數(shù):

void set_luaVar(lua_State *L){

? ? ?? lua_pushinteger(L, 100) ; ?? //將100壓入棧中

? ? ?? lua_setglobal(L, "var1"); ? //將剛壓入棧中值出棧并賦值給lua全局變量

? ? ? printf("為lua變量var1賦值100 ? \n\n");

}

在入口函數(shù)處加載Lua文件,并調(diào)用以上函數(shù):

int _tmain(int argc, _TCHAR* argv[]){

? ? ? ? lua_State *L = luaL_newstate(); ? ? ? ? ?? // 創(chuàng)建一個(gè)Lua執(zhí)行環(huán)境

? ? ? ? luaL_openlibs(L); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //打開(kāi)Lua庫(kù)

? ? ?? luaL_dofile(L, "main.lua"); ? ? ? ? ? ? ?? // 加載并執(zhí)行main.lua文件

? ? ?? get_luaVar(L); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? //獲取lua變量

? ? ?? set_luaVar(L); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //設(shè)置lua變量

? ? ?? get_luaVar(L); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //再獲取lua變量

? ? ?? lua_close(L); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //關(guān)閉lua執(zhí)行環(huán)境

? ? ?? system("pause"); ? ? ? ? ? ? ? ? ? ? ? ? ? ?? // 暫停windows輸出窗口具滴,方便查看輸出

? ? ?? return 0;

}

運(yùn)行程序得到如下打影汲啊:

this is in lua

讀取lua中var1變量的值? 5

為lua變量var1賦值100

讀取lua中var1變量的值? 100

請(qǐng)按任意鍵繼續(xù). . .

實(shí)現(xiàn)了對(duì)lua變量的賦值和讀取。

4抵蚊、查看虛擬棧中的值

? 在lua與C的交互中施绎,有些API將值從棧中彈出溯革,有的只是讀取里面的值不會(huì)將值從棧中彈出贞绳,如上面使用的lua_tonumber()這類API,?還有的不是將值而是將指針?lè)湃霔V兄孪 _@些需要平時(shí)總結(jié)下規(guī)律去熟練冈闭。這里介紹官方提供的一個(gè)方法,可以實(shí)時(shí)查看當(dāng)前堆棧的里面的值抖单。

static void stackDump(lua_State *L) {

? ?? int i;

? ? int top = lua_gettop(L); /* depth of the stack */

? ? for (i = 1; i <= top; i++) { /* repeat for each level */

? ? int t = lua_type(L, i);

? ? switch (t) {

? ? ?? case LUA_TSTRING: { /* strings */

? ? ? ? ? ? printf("'%s'", lua_tostring(L, i));

? ? ? ? ? ? break;

? ? ? ? }

? ? ? ? case LUA_TBOOLEAN: { /* Booleans */

? ? ? ? ?? printf(lua_toboolean(L, i) ? "true" : "false");

? ? ? ? ?? break;

? ? ? ? }

? ? ?? case LUA_TNUMBER: { /* numbers */

? ? ? ? ?? printf("%g", lua_tonumber(L, i));

? ? ? ? ?? break;

? ? ? }

? ? ?? default: { /* other values */

? ? ? ? ?? printf("%s", lua_typename(L, t));

? ? ? ? ? break;

? ? ? }

? ?? }

? ? ?? printf(" "); /* put a separator */

?? }

?? printf("\n"); /* end the listing */

}

在你想要查看當(dāng)前堆棧里面有什么值時(shí),調(diào)用stackDump()即可萎攒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者矛绘。
  • 序言:七十年代末耍休,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子货矮,更是在濱河造成了極大的恐慌羊精,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囚玫,死亡現(xiàn)場(chǎng)離奇詭異喧锦,居然都是意外死亡读规,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門燃少,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)束亏,“玉大人,你說(shuō)我怎么就攤上這事阵具“椋” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵阳液,是天一觀的道長(zhǎng)雀久。 經(jīng)常有香客問(wèn)我,道長(zhǎng)趁舀,這世上最難降的妖魔是什么赖捌? 我笑而不...
    開(kāi)封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮矮烹,結(jié)果婚禮上越庇,老公的妹妹穿的比我還像新娘。我一直安慰自己奉狈,他們只是感情好卤唉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著仁期,像睡著了一般桑驱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跛蛋,一...
    開(kāi)封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天熬的,我揣著相機(jī)與錄音,去河邊找鬼赊级。 笑死押框,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的理逊。 我是一名探鬼主播橡伞,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼晋被!你這毒婦竟也來(lái)了兑徘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤羡洛,失蹤者是張志新(化名)和其女友劉穎挂脑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡最域,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年谴分,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镀脂。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牺蹄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出薄翅,到底是詐尸還是另有隱情沙兰,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布翘魄,位于F島的核電站鼎天,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏暑竟。R本人自食惡果不足惜斋射,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望但荤。 院中可真熱鬧罗岖,春花似錦、人聲如沸腹躁。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纺非。三九已至哑了,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烧颖,已是汗流浹背弱左。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倒信,地道東北人科贬。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鳖悠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子优妙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,763評(píng)論 0 38
  • 當(dāng)在Lua和C之間交換數(shù)據(jù)時(shí)主要的問(wèn)題是自動(dòng)回收與手動(dòng)回收內(nèi)存管理的不一致乘综。因此,Lua 用一個(gè)抽象的棧在Lua與...
    luffier閱讀 2,638評(píng)論 0 3
  • lua作為小巧精悍的腳本語(yǔ)言套硼,易于嵌入c/c++中 卡辰, 廣泛應(yīng)用于游戲AI ,實(shí)際上在任何經(jīng)常變化的邏輯上都可以使...
    木易林1閱讀 1,500評(píng)論 0 4
  • 第一篇 語(yǔ)言 第0章 序言 Lua僅讓你用少量的代碼解決關(guān)鍵問(wèn)題。 Lua所提供的機(jī)制是C不擅長(zhǎng)的:高級(jí)語(yǔ)言九妈,動(dòng)態(tài)...
    testfor閱讀 2,657評(píng)論 1 7
  • 寒冬就要過(guò)去了反砌,登高遠(yuǎn)望,春之歸途卻是漫漫無(wú)期……思木來(lái)到聽(tīng)風(fēng)橋已經(jīng)不知道是第幾次了萌朱。 大風(fēng)呼嘯而過(guò)宴树,仿佛依然能輕...
    陳牧之洲閱讀 356評(píng)論 0 2