国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Lua - Lua教程(三):C語言、C++中調用Lua的Table示例

Lua教程(三):C語言、C++中調用Lua的Table示例

2020-04-10 14:51子龍山人 Lua

這篇文章主要介紹了Lua教程(三):C語言、C++中調用Lua的Table示例,即在C語言、C++中讀取、操作Lua的Table,需要的朋友可以參考下

從寫上一篇Lua的文章到現在,已經過去半月有余了,是時候讓自己的Lua狀態refresh一下了。本教程將介紹Lua的棧及基本棧操作,同時還有如何在C/C++代碼里面讀取Lua的Table。

理解Lua棧

Lua通過一個“虛擬棧”與C/C++程序進行數據交互,所有的Lua C API都是通過操作這個棧來完成相應的數據通信。 Lua的這個“虛擬棧”解決了C/C++程序與Lua程序通信的兩大問題:

1.Lua使用垃圾回收,而C/C++需要手動管理內存。

2.Lua使用動態類型,而C/C++使用的是靜態類型。

因為這個棧在Lua虛擬機內部,當一個Lua的變量放在棧里面的時候,虛擬機可以知道它有沒有被宿主程序所使用,從而決定是否采用GC。另外Lua采用結構體封裝了類似“Lua_Value”的類型,讓它可以存儲任何C的類型。從而在數據交換的時候,任何類型都可以被放入棧的一個slot中。

由于棧是FILO的,所以,當我們在Lua里面操作這個棧的時候,每次操作的都是棧的頂部。而Lua的C API則有更多的控制權,它可以非常靈活地操縱這個棧的任意位置的元素。

基本Lua棧操作

1.往棧里面壓入一個值

 

復制代碼 代碼如下:

void lua_pushnil      (lua_State *L);
void lua_pushboolean  (lua_State *L, int bool);
void lua_pushnumber   (lua_State *L, lua_Number n);
void lua_pushinteger  (lua_State *L, lua_Integer n);
void lua_pushunsigned (lua_State *L, lua_Unsigned n);
void lua_pushlstring  (lua_State *L, const char *s, size_t len);
void lua_pushstring   (lua_State *L, const char *s);

 

2.查詢棧里面的元素

 

復制代碼 代碼如下:

int lua_is* (lua_State * L, int index);

 

這里面的*可以是boolean,nil,string,function等等

3.獲取棧內給定位置的元素值

復制代碼 代碼如下:

xxx lua_toXXX(lua_State * L, int index);

 

這里面的xxx可以是nil, boolean, string,integer等等。

4.其它棧操作

 

復制代碼 代碼如下:

//取得棧中元素個數
 int  lua_gettop    (lua_State *L);
//設置棧的大小為一個指定的值,而lua_settop(L,0)會把當前棧清空
//如果指定的index大于之前棧的大小,那么空余的空間會被nil填充
//如果index小于之前的棧中元素個數,則多余的元素會被丟棄
 void lua_settop    (lua_State *L, int index);
//把棧中index所在位置的元素壓入棧
 void lua_pushvalue (lua_State *L, int index);
//移除棧中index所在位置的元素
void lua_remove(lua_State *L, int index);
//在棧的頂部的元素移動至index處
void lua_insert(lua_State *L, int index);
//從棧頂彈出一個值,并把它設置到給定的index處
void lua_replace(lua_State *L, int index);
//把fromidx處的元素copy一份插入到toidx,這操作不會修改fromidx處的元素
void lua_copy(lua_State *L, int fromidx, int toidx);

 

另外,根據《Programming In Lua》一書中的所講,我們可以定義一個函數stackDump來打印當前棧的情況:

復制代碼 代碼如下:

static void stackDump(lua_State* L){
    cout<<"\nbegin dump lua stack"<<endl;
    int i = 0;
    int top = lua_gettop(L);
    for (i = 1; i <= top; ++i) {
        int t = lua_type(L, i);
        switch (t) {
            case LUA_TSTRING:
            {
                printf("'%s' ", lua_tostring(L, i));
            }
                break;
            case LUA_TBOOLEAN:
            {
                printf(lua_toboolean(L, i) ? "true " : "false ");
            }break;
            case LUA_TNUMBER:
            {
                printf("%g ", lua_tonumber(L, i));
            }
                break;
            default:
            {
                printf("%s ", lua_typename(L, t));
            }
                break;
        }
    }
    cout<<"\nend dump lua stack"<<endl;
}

 

C/C++訪問Lua的Table

假設我們的Lua文件中有一個Table為:

 

復制代碼 代碼如下:

me = { name = "zilongshanren", age = 27}

 

我們可以通過以下C代碼來訪問它的元素:

 

復制代碼 代碼如下:

//從Lua里面取得me這個table,并壓入棧
lua_getglobal(L, "me");
if (!lua_istable(L, -1)) {
    CCLOG("error! me is not a table");
}
//往棧里面壓入一個key:name
lua_pushstring(L, "name");
//取得-2位置的table,然后把棧頂元素彈出,取出table[name]的值并壓入棧
lua_gettable(L, -2);
//輸出棧頂的name
CCLOG("name = %s", lua_tostring(L, -1));
stackDump(L);
//把棧頂元素彈出去
lua_pop(L, 1);
//壓入另一個key:age
lua_pushstring(L, "age");
   //取出-2位置的table,把table[age]的值壓入棧
lua_gettable(L, -2);
stackDump(L);
CCLOG("age = %td", lua_tointeger(L, -1));


Lua5.1還引入了一個新方法:

復制代碼 代碼如下:

lua_getfield(L, -1, "age");

 

它可以取代

 

復制代碼 代碼如下:

 //壓入另一個key:age
    lua_pushstring(L, "age");
   //取出-2位置的table,把table[age]的值壓入棧
    lua_gettable(L, -2);

 

下篇文章,我們將介紹Lua如何調用C/C++里面的函數。

延伸 · 閱讀

精彩推薦
  • LuaLua中的元方法__newindex詳解

    Lua中的元方法__newindex詳解

    這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監控賦值、通過table給另一個table賦值等內容,需要的朋友可以參考下 ...

    笨木頭8872020-04-09
  • LuaLua簡介、編譯安裝教程及變量等語法介紹

    Lua簡介、編譯安裝教程及變量等語法介紹

    這篇文章主要介紹了Lua簡介、編譯安裝教程及變量等語法介紹,本文同時講解了lua注釋語法、Lua命令行方式等內容,需要的朋友可以參考下 ...

    junjie3632020-04-14
  • LuaLua中table庫函數方法介紹

    Lua中table庫函數方法介紹

    這篇文章主要介紹了Lua中table庫函數方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下 ...

    腳本之家2502020-04-17
  • LuaLua和C語言的交互詳解

    Lua和C語言的交互詳解

    這篇文章主要介紹了Lua和C語言的交互詳解,Lua和C語言通過棧完成交互,本文結合代碼實例詳細講解了交互的方法,需要的朋友可以參考下 ...

    果凍想3702020-04-14
  • LuaLua教程(二):基礎知識、類型與值介紹

    Lua教程(二):基礎知識、類型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎知識、類型與值介紹,本文講解了Hello World程序、代碼規范、全局變量、類型與值等內容,需要的朋友可以參考下 ...

    腳本之家5922020-04-28
  • LuaLua實現__add方法重載示例

    Lua實現__add方法重載示例

    這篇文章主要介紹了Lua實現__add方法重載示例,本文直接給出實現代碼,需要的朋友可以參考下 ...

    腳本之家7452020-04-24
  • LuaLua中計算、執行字符串中Lua代碼的方法

    Lua中計算、執行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計算、執行字符串中Lua代碼的方法,類似JavaScript中eval函數的功能,在Lua中也可以實現,需要的朋友可以參考下 ...

    腳本之家6322020-04-30
  • Lua深入探究Lua中的解析表達式

    深入探究Lua中的解析表達式

    這篇文章主要介紹了深入探究Lua中的解析表達式,對于其語法部分的說明和示例都超詳細,極力推薦此文!需要的朋友可以參考下 ...

    腳本之家3542020-05-05
主站蜘蛛池模板: 成人av播放 | 精品国产一区二区三区四区 | 伊人久久一区 | 日韩a∨ | 黄瓜av | 欧美日韩国产精品一区 | 激情婷婷 | 国产在线中文字幕 | 性刺激久久久久久久久九色 | 农村少妇kkkk7777 | 视频一区在线播放 | 51ⅴ精品国产91久久久久久 | 亚洲国产精品成人va在线观看 | 欧美在线小视频 | 黑人草逼视频 | 日韩一区二区三区在线视频 | 狠狠操狠狠操 | 在线成人亚洲 | 久久久久久九九 | 精品在线一区 | 97精品在线 | 美女视频一区二区三区 | 黄色大片网站 | 国产一区二区免费视频 | 国产精品视频区 | 亚洲精品男人的天堂 | 国产精品久久精品 | 九热精品 | 日韩成人av电影在线观看 | 亚色成人 | 国产一级片儿 | 久久久小视频 | 久久69精品久久久久久久电影好 | 久久久久中文字幕 | 日韩中文字幕一区二区三区 | 免费黄色在线看 | 亚洲欧美日韩精品久久亚洲区 | 精品久久中文字幕 | 国产一区二区精品在线观看 | 97精品国产97久久久久久粉红 | 国产精品99精品久久免费 |