濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Lua中調(diào)用C語(yǔ)言函數(shù)實(shí)例

Lua中調(diào)用C語(yǔ)言函數(shù)實(shí)例

熱門(mén)標(biāo)簽:漳州智云呼電話機(jī)器人 百度地圖標(biāo)注早餐區(qū)域 冀州市地圖標(biāo)注 清朝地圖標(biāo)注哈爾濱 怎么去除地圖標(biāo)注 個(gè)人怎么在地圖標(biāo)注需要的店鋪 武漢外呼防封系統(tǒng)多少錢 地圖標(biāo)注大廈 新岸線智能電銷機(jī)器人

在上一篇文章(C調(diào)用lua函數(shù))中,講述了如何用c語(yǔ)言調(diào)用lua函數(shù),通常,A語(yǔ)言能調(diào)用B語(yǔ)言,反過(guò)來(lái)也是成立的。正如Java與c語(yǔ)言之間使用JNI來(lái)互調(diào),Lua與C也可以互調(diào)。

當(dāng)lua調(diào)用c函數(shù)時(shí),使用了和c調(diào)用lua中的同一種棧,c函數(shù)從棧中得到函數(shù),然后將結(jié)果壓入棧中。為了區(qū)分返回結(jié)果和棧中的其他值,每一個(gè)函數(shù)返回結(jié)果的個(gè)數(shù)。
這里有個(gè)重要的概念:這個(gè)棧不是全局的結(jié)構(gòu),每個(gè)函數(shù)都有自己的私有局部棧。哪怕c函數(shù)調(diào)用了lua代碼,lua代碼再次調(diào)用該c函數(shù),他們有各自獨(dú)立的局部棧。第一個(gè)參數(shù)的索引是1。
作為第一個(gè)例子,讓我們看看如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的函數(shù),返回給定2個(gè)參數(shù)的和:

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

static int l_plus(lua_State* L)
{
     lua_Integer a = lua_tointeger(L, 1);
     lua_Integer b = lua_tointeger(L, 2);
     lua_pushinteger(L, a+b);
     return 1;
}

每一個(gè)Lua注冊(cè)的函數(shù)都必須是這個(gè)原型,它已經(jīng)在lua.h中定義了:
復(fù)制代碼 代碼如下:

typedef int (*lua_CFunction) (lua_State *L);

由于c函數(shù)返回了一個(gè)int類型的返回值個(gè)數(shù)。因此,當(dāng)壓入返回值之前,不必要清理?xiàng)#琹ua會(huì)自動(dòng)移除返回值下面的任何數(shù)據(jù)。

在lua中使用該函數(shù)之前,我們需要注冊(cè)它。使用lua_pushcfunction,它接受一個(gè)c函數(shù),然后在lua內(nèi)部創(chuàng)建一個(gè)函數(shù)類型的值來(lái)表示該函數(shù)。

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

lua_pushcfunction(L, lua_plus);
lua_setglobal(L, "myplus");

一個(gè)專業(yè)點(diǎn)的寫(xiě)法是,我們必須檢查它的參數(shù)類型:
復(fù)制代碼 代碼如下:

static int l_plus(lua_State* L)
{
     lua_Integer a = luaL_checkinteger(L, 1);
     lua_Integer b = luaL_checkinteger(L, 2);
     lua_pushinteger(L, a+b);
     return 1;
}

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

#include lua.h>
#include lauxlib.h>
#include lualib.h>
static int l_plus(lua_State* L)
{
     lua_Integer a = luaL_checkinteger(L, 1);
     lua_Integer b = luaL_checkinteger(L, 2);
     lua_pushinteger(L, a+b);
     return 1;
}

int main()
{
     lua_State *L = luaL_newstate();
     luaL_openlibs(L);
     lua_pushcfunction(L, l_plus);
     lua_setglobal(L, "myplus");
     if (luaL_dostring(L, "print(myplus(2,2))")) {
          lua_close(L);
          error("Failed to invoke");
     }
     lua_close(L);
     return 0;
}


(完)

您可能感興趣的文章:
  • Lua教程(二十):Lua調(diào)用C函數(shù)
  • Lua教程(四):在Lua中調(diào)用C語(yǔ)言、C++的函數(shù)
  • Lua教程(三):C語(yǔ)言、C++中調(diào)用Lua的Table示例
  • C++中調(diào)用Lua函數(shù)實(shí)例
  • Lua中調(diào)用C++函數(shù)實(shí)例
  • Lua調(diào)用自定義C模塊
  • Lua教程(十九):C調(diào)用Lua
  • Lua編程示例(六): C語(yǔ)言調(diào)用Lua函數(shù)
  • C語(yǔ)言中調(diào)用Lua函數(shù)實(shí)例
  • C語(yǔ)言與Lua之間的相互調(diào)用詳解

標(biāo)簽:金昌 儋州 天門(mén) 宣城 濰坊 天門(mén) 臺(tái)灣 德宏

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua中調(diào)用C語(yǔ)言函數(shù)實(shí)例》,本文關(guān)鍵詞  Lua,中,調(diào)用,語(yǔ)言,函數(shù),實(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中調(diào)用C語(yǔ)言函數(shù)實(shí)例》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Lua中調(diào)用C語(yǔ)言函數(shù)實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    正安县| 双鸭山市| 渭南市| 法库县| 五台县| 武川县| 甘谷县| 安远县| 邯郸县| 长顺县| 苗栗市| 永丰县| 红河县| 万荣县| 同江市| 察隅县| 山东| 定南县| 申扎县| 广西| 黄浦区| 嫩江县| 清苑县| 台中市| 蒲城县| 普宁市| 三亚市| 乐至县| 余干县| 铁岭县| 文山县| 灵璧县| 栾城县| 九龙县| 准格尔旗| 融水| 池州市| 花垣县| 思南县| 赤水市| 桓仁|