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

主頁(yè) > 知識(shí)庫(kù) > Lua教程(二十一):編寫(xiě)C函數(shù)的技巧

Lua教程(二十一):編寫(xiě)C函數(shù)的技巧

熱門(mén)標(biāo)簽:艾比利外呼系統(tǒng) 電話機(jī)器人每天搜索多少次 昆明電話外呼系統(tǒng)好么 外呼系統(tǒng)一天耗費(fèi)多少流量 海口智能語(yǔ)音電銷(xiāo)機(jī)器人好用嗎 陜西便宜電銷(xiāo)機(jī)器人軟件 免費(fèi)門(mén)店地圖標(biāo)注注冊(cè)入駐 杞縣地圖標(biāo)注app 衡水外呼線路解決

1. 數(shù)組操作:

    在Lua中,“數(shù)組”只是table的一個(gè)別名,是指以一種特殊的方法來(lái)使用table。出于性能原因,Lua的C API為數(shù)組操作提供了專門(mén)的函數(shù),如:
 

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

    void lua_rawgeti(lua_State* L, int index, int key);
    void lua_rawseti(lua_State* L, int index, int key);
 

    以上兩個(gè)函數(shù)分別用于讀取和設(shè)置數(shù)組中的元素值。其中index參數(shù)表示待操作的table在棧中的位置,key表示元素在table中的索引值。由于這兩個(gè)函數(shù)均為原始操作,比涉及元表的table訪問(wèn)更快。通常而言,作為數(shù)組使用的table很少會(huì)用到元表。

    見(jiàn)如下代碼示例和關(guān)鍵性注釋:

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

#include stdio.h>
#include string.h>
#include lua.hpp>
#include lauxlib.h>
#include lualib.h>

extern "C" int mapFunc(lua_State* L)
{
    //檢查L(zhǎng)ua調(diào)用代碼中傳遞的第一個(gè)參數(shù)必須是table。否則將引發(fā)錯(cuò)誤。
    luaL_checktype(L,1,LUA_TTABLE);
    luaL_checktype(L,2,LUA_TFUNCTION);
    //獲取table中的字段數(shù)量,即數(shù)組的元素?cái)?shù)量。
    int n = lua_objlen(L,1);
    //Lua中的數(shù)組起始索引習(xí)慣為1,而不是C中的0。
    for (int i = 1; i = n; ++i) {
        lua_pushvalue(L,2);  //將Lua參數(shù)中的function(第二個(gè)參數(shù))的副本壓入棧中。
        lua_rawgeti(L,1,i);  //壓入table[i]
        lua_call(L,1,1);     //調(diào)用function(table[i]),并將函數(shù)結(jié)果壓入棧中。
        lua_rawseti(L,1,i);  //table[i] = 函數(shù)返回值,同時(shí)將返回值彈出棧。
    }

    //無(wú)結(jié)果返回給Lua代碼。
    return 0;
}

 2. 字符串操作:

    當(dāng)一個(gè)C函數(shù)從Lua收到一個(gè)字符串參數(shù)時(shí),必須遵守兩條規(guī)則:不要在訪問(wèn)字符串時(shí)從棧中將其彈出,不要修改字符串。在Lua的C API中主要提供了兩個(gè)操作Lua字符串的函數(shù),即:
 

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

    void  lua_pushlstring(lua_State *L, const char *s, size_t l);
    const char* lua_pushfstring(lua_State* L, const char* fmt, ...);
 

    第一個(gè)API用于截取指定長(zhǎng)度的子字符串,同時(shí)將其壓入棧中。而第二個(gè)API則類似于C庫(kù)中的sprintf函數(shù),并將格式化后的字符串壓入棧中。和sprintf的格式說(shuō)明符不同的是,該函數(shù)只支持%%(表示字符%)、%s(表示字符串)、%d(表示整數(shù))、%f(表示Lua中的number)及%c(表示字符)。除此之外,不支持任何例如寬度和精度的選項(xiàng)。

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

#include stdio.h>
#include string.h>
#include lua.hpp>
#include lauxlib.h>
#include lualib.h>

extern "C" int splitFunc(lua_State* L)
{
    const char* s = luaL_checkstring(L,1);
    const char* sep = luaL_checkstring(L,2); //分隔符
    const char* e;
    int i = 1;
    lua_newtable(L); //結(jié)果table
    while ((e = strchr(s,*sep)) != NULL) {
        lua_pushlstring(L,s,e - s);  //壓入子字符串。
        //將剛剛壓入的子字符串設(shè)置給table,同時(shí)賦值指定的索引值。
        lua_rawseti(L,-2,i++);      
        s = e + 1;
    }
    //壓入最后一個(gè)子串
    lua_pushstring(L,s);
    lua_rawseti(L,-2,i);
    return 1; //返回table。
}

 Lua API中提供了lua_concat函數(shù),其功能類似于Lua中的".."操作符,用于連接(并彈出)棧頂?shù)膎個(gè)值,然后壓入連接后的結(jié)果。其原型為:
    void  lua_concat(lua_State *L, int n);
    參數(shù)n表示棧中待連接的字符串?dāng)?shù)量。該函數(shù)會(huì)調(diào)用元方法。然而需要說(shuō)明的是,如果連接的字符串?dāng)?shù)量較少,該函數(shù)可以很好的工作,反之,則會(huì)帶來(lái)性能問(wèn)題。為此,Lua API提供了另外一組函數(shù)專門(mén)解決由此而帶來(lái)的性能問(wèn)題,見(jiàn)如下代碼示例:

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

#include stdio.h>
#include string.h>
#include lua.hpp>
#include lauxlib.h>
#include lualib.h>

extern "C" int strUpperFunc(lua_State* L)
{
    size_t len;
    luaL_Buffer b;
    //檢查參數(shù)第一個(gè)參數(shù)是否為字符串,同時(shí)返回字符串的指針及長(zhǎng)度。
    const char* s = luaL_checklstring(L,1,len);
    //初始化Lua的內(nèi)部Buffer。
    luaL_buffinit(L,b);
    //將處理后的字符依次(luaL_addchar)追加到Lua的內(nèi)部Buffer中。
    for (int i = 0; i len; ++i)
        luaL_addchar(b,toupper(s[i]));
    //將該Buffer及其內(nèi)容壓入棧中。
    luaL_pushresult(b);
    return 1;
}

  使用緩沖機(jī)制的第一步是聲明一個(gè)luaL_Buffer變量,并用luaL_buffinit來(lái)初始化它。初始化后,就可通過(guò)luaL_addchar將一個(gè)字符放入緩沖。除該函數(shù)之外,Lua的輔助庫(kù)還提供了直接添加字符串的函數(shù),如:
 

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

    void luaL_addlstring(luaL_Buffer* b, const char* s, size_t len);
    void luaL_addstring(luaL_Buffer* b, const char* s);
 

    最后luaL_pushresult會(huì)更新緩沖,并將最終的字符串留在棧頂。通過(guò)這些函數(shù),就無(wú)須再關(guān)心緩沖的分配了。但是在追加的過(guò)程中,緩沖會(huì)將一些中間結(jié)果放到棧中。因此,在使用時(shí)要留意此細(xì)節(jié),只要保證壓入和彈出的次數(shù)相等既可。Lua API還提供一個(gè)比較常用的函數(shù),用于將棧頂?shù)淖址驍?shù)字也追加到緩沖區(qū)中,函數(shù)原型為:
 
復(fù)制代碼 代碼如下:

    void luaL_addvalue(luaL_Buffer* b);
   

    3. 在C函數(shù)中保存狀態(tài):
    Lua API提供了三種方式來(lái)保存非局部變量,即注冊(cè)表、環(huán)境和upvalue。
    1). 注冊(cè)表:
    注冊(cè)表是一個(gè)全局的table,只能被C代碼訪問(wèn)。通常用于保存多個(gè)模塊間的共享數(shù)據(jù)。我們可以通過(guò)LUA_REGISTRYINDEX索引值來(lái)訪問(wèn)注冊(cè)表。

 

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

 #include stdio.h>
#include string.h>
#include lua.hpp>
#include lauxlib.h>
#include lualib.h>

void registryTestFunc(lua_State* L)
{
    lua_pushstring(L,"Hello");
    lua_setfield(L,LUA_REGISTRYINDEX,"key1");
    lua_getfield(L,LUA_REGISTRYINDEX,"key1");
    printf("%s\n",lua_tostring(L,-1));
}

int main()
{
    lua_State* L = luaL_newstate();
    registryTestFunc(L);
    lua_close(L);
    return 0;
}
 

 2). 環(huán)境:
    如果需要保存一個(gè)模塊的私有數(shù)據(jù),即模塊內(nèi)各函數(shù)需要共享的數(shù)據(jù),應(yīng)該使用環(huán)境。我們可以通過(guò)LUA_ENVIRONINDEX索引值來(lái)訪問(wèn)環(huán)境。
 

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

 #include lua.hpp>
#include lauxlib.h>
#include lualib.h>

//模塊內(nèi)設(shè)置環(huán)境數(shù)據(jù)的函數(shù)
extern "C" int setValue(lua_State* L)
{
    lua_pushstring(L,"Hello");
    lua_setfield(L,LUA_ENVIRONINDEX,"key1");
    return 0;
}

//模塊內(nèi)獲取環(huán)境數(shù)據(jù)的函數(shù)
extern "C" int getValue(lua_State* L)
{
    lua_getfield(L,LUA_ENVIRONINDEX,"key1");
    printf("%s\n",lua_tostring(L,-1));
    return 0;
}

static luaL_Reg myfuncs[] = {
    {"setValue", setValue},
    {"getValue", getValue},
    {NULL, NULL}
};


extern "C" __declspec(dllexport)
int luaopen_testenv(lua_State* L)
{
    lua_newtable(L);  //創(chuàng)建一個(gè)新的表用于環(huán)境
    lua_replace(L,LUA_ENVIRONINDEX); //將剛剛創(chuàng)建并壓入棧的新表替換為當(dāng)前模塊的環(huán)境表。
    luaL_register(L,"testenv",myfuncs);
    return 1;
}
 

Lua測(cè)試代碼如下。

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

 require "testenv"
 
 print(testenv.setValue())
 print(testenv.getValue())
 --輸出為:Hello

    3). upvalue:
    upvalue是和特定函數(shù)關(guān)聯(lián)的,我們可以將其簡(jiǎn)單的理解為函數(shù)內(nèi)的靜態(tài)變量。
復(fù)制代碼 代碼如下:

#include lua.hpp>
#include lauxlib.h>
#include lualib.h>

extern "C" int counter(lua_State* L)
{
    //獲取第一個(gè)upvalue的值。
    int val = lua_tointeger(L,lua_upvalueindex(1));
    //將得到的結(jié)果壓入棧中。
    lua_pushinteger(L,++val);
    //賦值一份棧頂?shù)臄?shù)據(jù),以便于后面的替換操作。
    lua_pushvalue(L,-1);
    //該函數(shù)將棧頂?shù)臄?shù)據(jù)替換到upvalue(1)中的值。同時(shí)將棧頂數(shù)據(jù)彈出。
    lua_replace(L,lua_upvalueindex(1));
    //lua_pushinteger(L,++value)中壓入的數(shù)據(jù)仍然保留在棧中并返回給Lua。
    return 1;
}

extern "C" int newCounter(lua_State* L)
{
    //壓入一個(gè)upvalue的初始值0,該函數(shù)必須先于lua_pushcclosure之前調(diào)用。
    lua_pushinteger(L,0);
    //壓入閉包函數(shù),參數(shù)1表示該閉包函數(shù)的upvalue數(shù)量。該函數(shù)返回值,閉包函數(shù)始終位于棧頂。
    lua_pushcclosure(L,counter,1);
    return 1;
}

static luaL_Reg myfuncs[] = {
    {"counter", counter},
    {"newCounter", newCounter},
    {NULL, NULL}
};


extern "C" __declspec(dllexport)
int luaopen_testupvalue(lua_State* L)
{
    luaL_register(L,"testupvalue",myfuncs);
    return 1;
}

    Lua測(cè)試代碼如下。

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

require "testupvalue"

func = testupvalue.newCounter();
print(func());
print(func());
print(func());

func = testupvalue.newCounter();
print(func());
print(func());
print(func());

--[[ 輸出結(jié)果為:
1
2
3
1
2
3
--]]

您可能感興趣的文章:
  • Lua教程(十): 全局變量和非全局的環(huán)境
  • Lua教程(十一):模塊與包詳解
  • Lua教程(十二):面向?qū)ο缶幊?/li>
  • Lua教程(十三):弱引用table
  • Lua教程(十四):字符串庫(kù)詳解
  • Lua教程(十五):輸入輸出庫(kù)(I/O庫(kù))
  • Lua教程(十六):系統(tǒng)庫(kù)(os庫(kù))
  • Lua教程(十七):C API簡(jiǎn)介
  • Lua教程(十九):C調(diào)用Lua
  • Lua教程(二十):Lua調(diào)用C函數(shù)

標(biāo)簽:臨滄 西寧 營(yíng)口 南京 宿遷 泰安 昌都 海口

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua教程(二十一):編寫(xiě)C函數(shù)的技巧》,本文關(guān)鍵詞  Lua,教程,二十一,編寫(xiě),函數(shù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua教程(二十一):編寫(xiě)C函數(shù)的技巧》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Lua教程(二十一):編寫(xiě)C函數(shù)的技巧的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    激情偷乱视频一区二区三区| 经典三级一区二区| 色综合欧美在线| 粉嫩aⅴ一区二区三区四区| 青青草成人在线观看| 成人av手机在线观看| 777午夜精品视频在线播放| 国产福利精品一区| 国产精品一二三区在线| av在线综合网| 九一久久久久久| 亚洲6080在线| 丝袜国产日韩另类美女| www国产成人| 欧美va亚洲va国产综合| 一区二区三区国产精华| 国产精品日韩成人| 久久精品日韩一区二区三区| 国产成人一级电影| 成人深夜在线观看| 国产成人精品亚洲777人妖| 午夜一区二区三区在线观看| 日韩电影免费一区| 五月天丁香久久| 午夜av一区二区| 亚洲高清在线精品| 亚洲国产日日夜夜| 亚洲午夜精品在线| 成人高清视频在线观看| 国产一区91精品张津瑜| 粉嫩一区二区三区在线看| 午夜伦欧美伦电影理论片| 亚洲精品成a人| 在线观看日韩高清av| 国产精品沙发午睡系列990531| 欧美tk—视频vk| 久久众筹精品私拍模特| 日韩欧美一区二区久久婷婷| 国产午夜精品一区二区三区嫩草 | 国产乱码精品一区二区三区忘忧草 | 蜜桃av一区二区三区电影| 国产色产综合产在线视频| 欧美性色黄大片| av在线综合网| 蜜桃免费网站一区二区三区| 亚洲午夜在线观看视频在线| 国产精品美女久久久久aⅴ| 日韩限制级电影在线观看| 91国产成人在线| 99综合影院在线| 91原创在线视频| 99久久99久久综合| 国产精品一区二区果冻传媒| 久久精品免费看| 亚洲.国产.中文慕字在线| 亚洲精品国产高清久久伦理二区| 欧美激情一区三区| 久久中文字幕电影| 久久先锋资源网| 久久久精品2019中文字幕之3| 日韩一区和二区| 在线不卡一区二区| 911精品产国品一二三产区| 欧美日韩一区成人| 在线精品亚洲一区二区不卡| 91在线你懂得| 91国偷自产一区二区三区观看| 色综合亚洲欧洲| 91理论电影在线观看| 色综合色狠狠综合色| 国产欧美一区二区精品婷婷| 国产日韩欧美高清| 欧美精品一区二区三区蜜桃视频 | 免费观看成人鲁鲁鲁鲁鲁视频| 日韩伦理免费电影| 国产精品传媒视频| 欧美少妇xxx| 免费欧美高清视频| 亚洲欧美激情插| 一区二区三区高清在线| 国产欧美日产一区| 国产精品久99| 久久精品一区二区三区不卡| 精品国产露脸精彩对白| 精品99一区二区| 精品精品欲导航| 欧美国产一区视频在线观看| 在线一区二区观看| 91小视频在线观看| 91麻豆精品国产91久久久久久 | 欧美在线影院一区二区| 韩国中文字幕2020精品| 国产传媒一区在线| 亚洲444eee在线观看| 韩国精品免费视频| jlzzjlzz亚洲女人18| 国产网站一区二区三区| 一区二区国产视频| 日本成人超碰在线观看| 日韩一区二区在线看| bt欧美亚洲午夜电影天堂| 蜜臀久久久99精品久久久久久| 国产成人自拍网| 欧美三级视频在线播放| 中文字幕av不卡| 国产精品一区二区黑丝| 777久久久精品| 自拍偷在线精品自拍偷无码专区| 一区二区三区四区高清精品免费观看| 国产真实乱子伦精品视频| 欧美麻豆精品久久久久久| 亚洲欧美另类久久久精品2019| 欧美在线观看禁18| 男人的j进女人的j一区| 欧美一级免费大片| 精品中文字幕一区二区小辣椒| 欧美激情综合在线| 中文字幕一区二区在线观看 | 91精品国产福利| 91美女在线视频| 色哟哟国产精品| 91浏览器打开| 欧美亚洲精品一区| 91精品国产综合久久精品| 欧美少妇一区二区| 久久久久国产精品人| 国产精品久久久久久久久晋中| 亚洲天堂福利av| 亚洲成人在线观看视频| 精一区二区三区| 欧美日韩视频在线观看一区二区三区 | 在线免费精品视频| 欧美成人性战久久| 久久午夜国产精品| 亚洲成人福利片| 国产成人综合网站| 日韩一级欧美一级| 久久久亚洲高清| 一区二区三区四区不卡视频| 欧美aⅴ一区二区三区视频| 日本精品一区二区三区四区的功能| 欧美日韩激情一区二区三区| www精品美女久久久tv| 亚洲激情图片小说视频| av电影在线观看不卡| 国产婷婷色一区二区三区| 国内精品伊人久久久久av一坑 | 日韩久久久精品| 偷拍一区二区三区| 在线观看av不卡| 午夜国产不卡在线观看视频| 日本道色综合久久| 亚洲超丰满肉感bbw| 欧美私人免费视频| 日本欧美一区二区三区乱码| 日韩精品在线看片z| 国产精品原创巨作av| 国产精品乱子久久久久| 91蝌蚪porny| 亚洲成av人影院| 日韩精品一区二区三区中文精品 | 中文字幕不卡在线观看| 国产乱码精品一区二区三区五月婷| 久久综合色综合88| 国产成人在线网站| 亚洲精品国产视频| 日韩情涩欧美日韩视频| 蜜臀av性久久久久蜜臀aⅴ| 久久色在线观看| 91蜜桃在线观看| 日本欧美一区二区在线观看| 欧美大片在线观看一区| 成人动漫一区二区在线| 亚洲资源中文字幕| 久久久99精品免费观看| 欧美日韩一区二区在线观看| 久久99精品国产91久久来源| 中文字幕第一页久久| 日韩一级高清毛片| 在线亚洲一区二区| 成人晚上爱看视频| 国产精品中文字幕日韩精品| 免费一区二区视频| 亚洲猫色日本管| 日韩伦理电影网| 国产精品午夜久久| 久久久亚洲国产美女国产盗摄| 精品福利在线导航| 欧美日韩一级大片网址| fc2成人免费人成在线观看播放 | 国产精品久久久久久福利一牛影视| 日韩欧美国产系列| 久久九九全国免费| 欧美激情在线一区二区三区| 久久久亚洲高清| 亚洲欧美另类图片小说| 最近日韩中文字幕| 亚洲国产aⅴ成人精品无吗| 亚洲第一成年网| 麻豆91在线播放免费|