亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

簡單談談lua和c的交互

2024-07-21 23:05:01
字體:
來源:轉載
供稿:網友

介紹

ch/jiaoben/lua/269335.html">lua和c的親密接觸,靠的是一個虛擬棧。lua通過這個虛擬棧來實現和c之間值的互傳。棧上的每一個元素是一個lua值(nil,number,string...)。

當lua調用c函數的時候,這個函數會得到一個新的棧,這個棧獨立于c函數本身的棧,也獨立于lua自己的棧。它里面包含了lua要傳給c的所有參數,然后c函數會把返回的結果放入這個棧中返回給調用者。

對于棧的查詢操作,如果按照棧的規則,只能拿到棧頂的元素。但這里和常規的棧有一些差異。就是可以用一個索引來指向棧上的任何元素。正數的索引(1...n)指向從棧底到棧頂元素,1就是最先入棧的元素,n就是棧頂的元素,負數的索引(-1...-n)指向從棧頂到棧底的元素,-1就是棧頂元素,-n就是最先入棧的元素。通過這兩種索引方式可以很方便的獲取棧中的元素。

基本操作

lua和c之間的交互的橋梁是一個虛擬棧,這個虛擬棧在lua的c api中為lua_State,下面的代碼展示了從創建棧,元素入棧,根據索引獲取棧中元素的值的過程,這也是lua_State的最基本的操作。

lua_State *L = luaL_newstate();//創建一個新的棧lua_pushstring(L, "muzixiaoxin"); //把一個字符串壓入棧lua_pushnumber(L, 875);//把一個整型壓入棧//現在棧內有兩個元素,棧底是字符串"muzixiaoxin",棧頂是整型875//"muzixiaoxin"的索引就是1,或者-2//855的索引就是2,或者-1if (lua_isstring(L, 1)){//判斷棧底的元素是不是字符串  printf("%s/n",lua_tostring(L, 1));//如果是字符串就轉換成字符串輸出}if (lua_isnumber(L, -1)){//判斷棧頂元素是不是number類型  printf("%d", lua_tonumber(L, 2));//如果是就轉換成number類型輸出}lua_close(L); //記得不需要的時候要釋放掉

c調用lua

調用lua這種情況我見到的比較少,一般都是用lua虛擬機直接跑腳本。也有一些把lua作為配置文件給c用的。

舉個例子,新建一個lua文件test.lua

name = "muzixiaoxin"version = 1003

c需要通過lua c api把這個文件加載進來,然后執行,執行的結果存在一個棧中, 去這個棧中拿到變量的值。

看下面的c代碼:

lua_State *L = luaL_newstate();int err = luaL_loadfile(L, "test.lua"); //把lua文件加載成代碼塊,只加載不運行if (err){  return;}err = lua_pcall(L, 0, 0, 0);//運行加載的代碼塊if (err){  return;}lua_getglobal(L, "name"); //把全局變量name的值壓入棧頂printf("%s/n", lua_tostring(L, -1));//取出棧頂元素打印結果為:muzixiaoxinlua_close(L); //記得不需要的時候要釋放掉

lua調用c方法

lua調用c有些麻煩,要寫一個固定格式的方法來供lua調用。

我們先簡單的寫個求和的c方法:

//計算求和的方法static intsum(int a, int b){  return a + b;}

這個方法就是求兩個整型的和。我們要讓lua使用這個方法,就要先把這個方法注冊給lua的狀態機,但注冊給lua狀態機的方法要求有固定的參數和固定的返回值,參數要是是一個lua虛擬棧,這個虛擬棧存放著lua傳過來的參數,lua調用的返回值也要通過這個虛擬棧返回給lua,最后的返回值要求是一個int值,存著返回給lua變量的個數。我們看寫好的方法:

//lua調用的方法static intlsum(lua_State *L){  int a = (int)lua_tonumber(L, -1);//lua調用的參數之一  int b = (int)lua_tonumber(L, -2);//lua調用的參數之一  lua_pushnumber(L, sum(a, b));//把計算的加過壓棧  return 1;//返回返回值的個數}

下一步是吧lsum這個方法注冊給lua狀態機:

lua_State *L = luaL_newstate();luaL_openlibs(L);//打開L中的所有標準庫,這樣就可以使用print方法lua_register(L, "sum", lsum);//把c函數lsum注冊為lua的一個全局變量sumint err = luaL_dofile(L, "test.lua"); //把lua文件加載成代碼塊,并運行if (err){  return;}lua_close(L);

test.lua的內容是:

print("1 + 2 = " .. sum(1,2))

最后的輸出結果:

1+2=3

總結一下,就是,你要通過一個中間函數(像lsum這種)對lua虛擬棧進行操作來實現lua調用c的方法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品第一国产综合精品| 国产欧美日韩综合精品| 91网站免费观看| 51精品在线观看| 国产欧美一区二区三区视频| 久久香蕉国产线看观看网| 成人444kkkk在线观看| 日韩av免费网站| 成人h片在线播放免费网站| 国产精品男人的天堂| 欧美在线www| 色偷偷888欧美精品久久久| 欧美美女操人视频| 欧美日韩亚洲激情| 欧美性极品xxxx做受| 日韩av最新在线观看| 性欧美xxxx视频在线观看| 欧美人与性动交a欧美精品| 国产xxx69麻豆国语对白| 国产精品海角社区在线观看| 日韩电视剧在线观看免费网站| 日韩视频中文字幕| 久久香蕉精品香蕉| 亚洲日本aⅴ片在线观看香蕉| 51久久精品夜色国产麻豆| 欧美极品美女电影一区| 亚洲国产日韩欧美综合久久| 国产在线观看一区二区三区| 5566成人精品视频免费| 亚洲精品动漫100p| 日韩中文在线不卡| 69视频在线免费观看| 国产成人a亚洲精品| 欧美激情一二区| 精品无人区乱码1区2区3区在线| 日韩欧美国产一区二区| 91精品久久久久久| 欧美日韩国产一区中文午夜| 国产免费久久av| 欧美大尺度在线观看| 亚洲九九九在线观看| 欧美有码在线观看视频| 欧美性猛交xxxx久久久| 日本高清视频精品| 精品久久久久久中文字幕一区奶水| 在线观看欧美www| 亚洲福利精品在线| 亚洲精品欧美日韩专区| 国产精品影片在线观看| 日本高清不卡在线| 亚洲免费成人av电影| 91久久久亚洲精品| 国产一区二区成人| 亚洲精品v欧美精品v日韩精品| 91久久久亚洲精品| 日韩在线免费av| 成人性生交大片免费观看嘿嘿视频| 久久精品国产清自在天天线| 欧美成人午夜免费视在线看片| 亚洲国产精品人久久电影| 国产香蕉97碰碰久久人人| 中文字幕在线精品| 96sao精品视频在线观看| 欧美激情国内偷拍| 国产精品永久免费视频| 欧美怡红院视频一区二区三区| 插插插亚洲综合网| 国产日韩在线观看av| 岛国av一区二区在线在线观看| 亚洲精品国产精品国自产观看浪潮| 91九色国产社区在线观看| 亚洲在线免费看| 日本在线精品视频| 亚洲精品久久久久久久久| 亚洲成人av中文字幕| 91成人精品网站| 国产精品欧美一区二区| 中文日韩在线观看| 亚洲精品www| 日本欧美一二三区| 国产精品久久久久国产a级| 97在线精品视频| 日韩女在线观看| 欧美日韩亚洲一区二区三区| 国产精品27p| 亚洲欧美在线播放| 欧美黑人xxxⅹ高潮交| 九九久久久久久久久激情| 亚洲亚裔videos黑人hd| 亚洲国产福利在线| 亚洲美女又黄又爽在线观看| 国产精品www色诱视频| 精品一区二区三区四区在线| 日韩欧美一区二区三区| 最近2019免费中文字幕视频三| 成人有码在线播放| 成人h片在线播放免费网站| 欧美激情视频一区二区| 国产在线观看精品一区二区三区| 中文字幕av一区中文字幕天堂| 亚洲伦理中文字幕| 国产精品久久久久国产a级| 亚洲精品国产精品乱码不99按摩| 国产亚洲一区二区精品| 日韩在线视频中文字幕| 欧美精品日韩三级| 51色欧美片视频在线观看| 91av在线网站| 亚洲国产欧美日韩精品| 国产一区私人高清影院| 日韩精品黄色网| 欧美xxxx做受欧美| 久久99久久99精品中文字幕| 国产伦精品一区二区三区精品视频| 中文字幕无线精品亚洲乱码一区| 久久免费精品日本久久中文字幕| 亚洲老头同性xxxxx| 亚洲激情成人网| 欧美一级电影免费在线观看| 日韩高清电影好看的电视剧电影| 欧美综合第一页| 91久久久国产精品| 久久免费在线观看| 国产精品自产拍高潮在线观看| 欧美肥老太性生活视频| 欧洲亚洲在线视频| 精品国产精品三级精品av网址| 伊人精品在线观看| 亚洲午夜国产成人av电影男同| 亚洲国产美女精品久久久久∴| 亚洲天堂成人在线视频| 成人免费视频xnxx.com| 欧美视频国产精品| 国产拍精品一二三| 日韩欧美国产一区二区| 国产亚洲精品美女| 性欧美办公室18xxxxhd| 美日韩在线视频| 日韩在线观看网站| 欧美激情国内偷拍| 亚洲精品久久久久| 欧美性极品少妇精品网站| 亚洲自拍偷拍在线| 亚洲国产成人久久综合一区| 久久久久久69| 日韩成人中文电影| 国产亚洲精品一区二555| 亚洲午夜未删减在线观看| 亚洲国产精久久久久久| 韩国福利视频一区| 日韩国产在线播放| 久久精品成人欧美大片古装| 国产91免费观看| 欧美猛交ⅹxxx乱大交视频| 久久久久免费精品国产| 国产精品777| 日韩高清电影免费观看完整版| 亚洲网站在线播放| 欧美野外猛男的大粗鳮| 国产亚洲成av人片在线观看桃| 91av视频在线| 成人网欧美在线视频| 国产精品一香蕉国产线看观看| 美女扒开尿口让男人操亚洲视频网站|