青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

每天早晨叫醒你的不是鬧鐘,而是夢想

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  62 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

常用鏈接

留言簿(1)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 1. 基礎:
    Lua的一項重要用途就是作為一種配置語言?,F在從一個簡單的示例開始吧。
    --這里是用Lua代碼定義的窗口大小的配置信息
    width = 200
    height = 300
    下面是讀取配置信息的C/C++代碼:   

復制代碼
1 #include <stdio.h>  
2
#include <string.h>
3
#include <lua.hpp>
4
#include <lauxlib.h>
5
#include <lualib.h>
6

7
void load(lua_State* L, const char* fname, int* w, int* h) {
8
if (luaL_loadfile(L,fname) || lua_pcall(L,0,0,0)) {
9
printf("Error Msg is %s.\n",lua_tostring(L,-1));
10 return;
11 }
12 lua_getglobal(L,"width");
13 lua_getglobal(L,"height");
14 if (!lua_isnumber(L,-2)) {
15 printf("'width' should be a number\n" );
16 return;
17 }
18 if (!lua_isnumber(L,-1)) {
19 printf("'height' should be a number\n" );
20 return;
21 }
22 *w = lua_tointeger(L,-2);
23 *h = lua_tointeger(L,-1);
24 }
25
26
27 int main()
28 {
29 lua_State* L = luaL_newstate();
30 int w,h;
31 load(L,"D:/test.lua",&w,&h);
32 printf("width = %d, height = %d\n",w,h);
33 lua_close(L);
34 return 0;
35 }
復制代碼

    下面是針對新函數的解釋:
    lua_getglobal是宏,其原型為:#define lua_getglobal(L,s)  lua_getfield(L, LUA_GLOBALSINDEX, (s))
    每次調用這個宏的時候,都會將Lua代碼中與之相應的全局變量值壓入棧中,第一次調用時將全局變量"width"的值壓入棧中,之后再次調用時再將"height"的值也壓入棧中。

    2. table操作:
    我們可以在C語言的代碼中操作Lua中的table數據,這是一個非常非常方便且實用的功能。這樣不僅可以使Lua代碼的結構更加清晰,也可以在C語言代碼中定義等同的結構體與之對應,從而大大提高代碼的可讀性。見如下代碼:

復制代碼
1 #include <stdio.h>  
2
#include <string.h>
3
#include <lua.hpp>
4
#include <lauxlib.h>
5
#include <lualib.h>
6

7
void load(lua_State* L) {
8

9 if (luaL_loadstring(L,"background = { r = 0.30, g = 0.10, b = 0 }")
10 || lua_pcall(L,0,0,0)) {
11 printf("Error Msg is %s.\n",lua_tostring(L,-1));
12 return;
13 }
14 lua_getglobal(L,"background");
15 if (!lua_istable(L,-1)) {
16 printf("'background' is not a table.\n" );
17 return;
18 }
19 lua_getfield(L,-1,"r");
20 if (!lua_isnumber(L,-1)) {
21 printf("Invalid component in background color.\n");
22 return;
23 }
24 int r = (int)(lua_tonumber(L,-1) * 255);
25 lua_pop(L,1);
26 lua_getfield(L,-1,"g");
27 if (!lua_isnumber(L,-1)) {
28 printf("Invalid component in background color.\n");
29 return;
30 }
31 int g = (int)(lua_tonumber(L,-1) * 255);
32 lua_pop(L,1);
33
34 lua_pushnumber(L,0.4);
35 lua_setfield(L,-2,"b");
36
37 lua_getfield(L,-1,"b");
38 if (!lua_isnumber(L,-1)) {
39 printf("Invalid component in background color.\n");
40 return;
41 }
42 int b = (int)(lua_tonumber(L,-1) * 255);
43 printf("r = %d, g = %d, b = %d\n",r,g,b);
44 lua_pop(L,1);
45 lua_pop(L,1);
46 return;
47 }
48
49 int main()
50 {
51 lua_State* L = luaL_newstate();
52 load(L);
53 lua_close(L);
54 return 0;
55 }
復制代碼

    void lua_getfield(lua_State *L, int idx, const char *k); 第二個參數是table變量在棧中的索引值,最后一個參數是table的鍵值,該函數執行成功后會將字段值壓入棧中。
    void lua_setfield(lua_State *L, int idx, const char *k); 第二個參數是table變量在棧中的索引值,最后一個參數是table的鍵名稱,而字段值是通過上一條命令lua_pushnumber(L,0.4)壓入到棧中的,該函數在執行成功后會將剛剛壓入的字段值彈出棧。
    
    下面的代碼示例是在C語言代碼中構造table對象,同時初始化table的字段值,最后再將table對象賦值給Lua中的一個全局變量。

復制代碼
1 #include <stdio.h>  
2
#include <string.h>
3
#include <lua.hpp>
4
#include <lauxlib.h>
5
#include <lualib.h>
6

7
void load(lua_State* L)
8
{
9
lua_newtable(L);
10 lua_pushnumber(L,0.3);
11 lua_setfield(L,-2,"r");
12
13 lua_pushnumber(L,0.1);
14 lua_setfield(L,-2,"g");
15
16 lua_pushnumber(L,0.4);
17 lua_setfield(L,-2,"b");
18 lua_setglobal(L,"background");
19
20 lua_getglobal(L,"background");
21 if (!lua_istable(L,-1)) {
22 printf("'background' is not a table.\n" );
23 return;
24 }
25 lua_getfield(L,-1,"r");
26 if (!lua_isnumber(L,-1)) {
27 printf("Invalid component in background color.\n");
28 return;
29 }
30 int r = (int)(lua_tonumber(L,-1) * 255);
31 lua_pop(L,1);
32 lua_getfield(L,-1,"g");
33 if (!lua_isnumber(L,-1)) {
34 printf("Invalid component in background color.\n");
35 return;
36 }
37 int g = (int)(lua_tonumber(L,-1) * 255);
38 lua_pop(L,1);
39
40 lua_getfield(L,-1,"b");
41 if (!lua_isnumber(L,-1)) {
42 printf("Invalid component in background color.\n");
43 return;
44 }
45 int b = (int)(lua_tonumber(L,-1) * 255);
46 printf("r = %d, g = %d, b = %d\n",r,g,b);
47 lua_pop(L,1);
48 lua_pop(L,1);
49 return;
50 }
51
52 int main()
53 {
54 lua_State* L = luaL_newstate();
55 load(L);
56 lua_close(L);
57 return 0;
58 }
復制代碼

    上面的代碼將輸出和之前代碼相同的結果。
    lua_newtable是宏,其原型為:#define lua_newtable(L) lua_createtable(L, 0, 0)。調用該宏后,Lua會生成一個新的table對象并將其壓入棧中。
    lua_setglobal是宏,其原型為:#define lua_setglobal(L,s) lua_setfield(L,LUA_GLOBALSINDEX,(s))。調用該宏后,Lua會將當前棧頂的值賦值給第二個參數指定的全局變量名。該宏在執行成功后,會將剛剛賦值的值從棧頂彈出。

    3. 調用Lua函數:
    調用函數的API也很簡單。首先將待調用函數壓入棧,再壓入函數的參數,然后使用lua_pcall進行實際的調用,最后將調用結果從棧中彈出。見如下代碼:

復制代碼
1 #include <stdio.h>  
2
#include <string.h>
3
#include <lua.hpp>
4
#include <lauxlib.h>
5
#include <lualib.h>
6

7
const char* lua_function_code = "function add(x,y) return x + y end";
8

9
void call_function(lua_State* L)
10 {
11 //luaL_dostring 等同于luaL_loadstring() || lua_pcall()
12 //注意:在能夠調用Lua函數之前必須執行Lua腳本,否則在后面實際調用Lua函數時會報錯,
13 //錯誤信息為:"attempt to call a nil value."
14 if (luaL_dostring(L,lua_function_code)) {
15 printf("Failed to run lua code.\n");
16 return;
17 }
18 double x = 1.0, y = 2.3;
19 lua_getglobal(L,"add");
20 lua_pushnumber(L,x);
21 lua_pushnumber(L,y);
22 //下面的第二個參數表示帶調用的lua函數存在兩個參數。
23 //第三個參數表示即使帶調用的函數存在多個返回值,那么也只有一個在執行后會被壓入棧中。
24 //lua_pcall調用后,虛擬棧中的函數參數和函數名均被彈出。
25 if (lua_pcall(L,2,1,0)) {
26 printf("error is %s.\n",lua_tostring(L,-1));
27 return;
28 }
29 //此時結果已經被壓入棧中。
30 if (!lua_isnumber(L,-1)) {
31 printf("function 'add' must return a number.\n");
32 return;
33 }
34 double ret = lua_tonumber(L,-1);
35 lua_pop(L,-1); //彈出返回值。
36 printf("The result of call function is %f.\n",ret);
37 }
38
39 int main()
40 {
41 lua_State* L = luaL_newstate();
42 call_function(L);
43 lua_close(L);
44 return 0;
45 }
復制代碼
posted on 2014-02-17 17:44 沛沛 閱讀(372) 評論(0)  編輯 收藏 引用 所屬分類: Script
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲女女女同性video| 欧美在线免费视屏| 久久人人超碰| 欧美在线3区| 国产视频久久网| 久久精品亚洲| 久久不射2019中文字幕| 国产综合色在线视频区| 久久九九精品99国产精品| 亚洲欧美欧美一区二区三区| 国产精品人人爽人人做我的可爱| 亚洲一区中文| 欧美一级午夜免费电影| 国产一区二区三区免费在线观看 | 欧美日韩一区不卡| 日韩一级在线| 亚洲午夜在线观看| 国产欧美在线视频| 免费观看日韩| 欧美极品一区| 亚洲欧美精品在线观看| 欧美在线视频全部完| 亚洲第一中文字幕在线观看| 欧美国产日韩精品免费观看| 欧美激情第六页| 午夜精品影院| 久久乐国产精品| 一区二区欧美在线| 欧美一区二区国产| 亚洲精品久久久久久久久久久久| 亚洲精品在线观看免费| 国产亚洲欧美另类一区二区三区| 女生裸体视频一区二区三区| 欧美日韩一区二区在线视频| 久久一二三区| 欧美日韩国产探花| 久久伊人精品天天| 欧美日韩成人在线视频| 久久久久久久91| 欧美日韩国产一区| 免费欧美日韩| 国产精品一二三四| 亚洲激情婷婷| 国内揄拍国内精品久久| 日韩午夜电影av| 激情偷拍久久| 亚洲午夜精品| 99综合精品| 久久人人爽人人爽| 欧美亚洲在线| 欧美精品一区二| 久久成人综合视频| 欧美天堂亚洲电影院在线播放| 麻豆成人在线观看| 国产农村妇女精品一二区| 91久久久精品| 亚洲品质自拍| 久久在线观看视频| 欧美一区午夜精品| 国产精品久久久久久久久久久久 | 欧美一区二区三区视频| 欧美精品1区| 农夫在线精品视频免费观看| 国产一区二区三区观看| 亚洲综合导航| 午夜视频久久久久久| 欧美色欧美亚洲另类七区| 亚洲黄色天堂| 日韩视频免费大全中文字幕| 男女精品视频| 欧美激情视频给我| 亚洲高清不卡在线| 久久久天天操| 亚洲电影网站| 亚洲精品视频在线观看网站| 欧美mv日韩mv国产网站| 媚黑女一区二区| 在线看片欧美| 免费欧美电影| 91久久精品美女高潮| 日韩视频一区二区三区| 免费欧美网站| 亚洲精选在线| 亚洲欧美日韩中文视频| 国产精品剧情在线亚洲| 亚洲在线1234| 久久九九热re6这里有精品| 国产日韩欧美不卡| 久久久精品动漫| 亚洲成人自拍视频| 99精品视频免费在线观看| 欧美日韩精品一本二本三本| 一区二区三区国产盗摄| 午夜精品国产精品大乳美女| 国产日韩欧美一区在线| 久久久精品动漫| 亚洲激情视频在线播放| 亚洲欧美美女| 好男人免费精品视频| 麻豆亚洲精品| 中文国产一区| 久久婷婷麻豆| 亚洲视频axxx| 激情久久综艺| 欧美久久影院| 欧美淫片网站| 亚洲精品视频免费在线观看| 欧美在线视频一区二区| 亚洲激情影院| 国产精品一页| 欧美韩日一区| 欧美亚洲在线播放| 亚洲国产欧美一区| 午夜日韩福利| 日韩午夜黄色| 国产在线视频欧美一区二区三区| 欧美国产激情二区三区| 欧美与黑人午夜性猛交久久久| 亚洲电影中文字幕| 香蕉亚洲视频| 9色porny自拍视频一区二区| 国产三级欧美三级| 欧美日韩午夜激情| 久热精品视频在线| 亚洲一级免费视频| 亚洲级视频在线观看免费1级| 久久成人精品电影| 亚洲午夜视频| 91久久精品国产91久久性色| 国产午夜精品福利| 欧美午夜精品久久久久久人妖 | 一二三区精品| 欧美成人资源网| 欧美专区亚洲专区| 亚洲特级片在线| 亚洲日本电影| 在线观看成人小视频| 国产欧美va欧美va香蕉在| 欧美日韩国产小视频| 免费h精品视频在线播放| 欧美影院在线| 久久成年人视频| 亚洲欧美日韩一区在线观看| 亚洲天堂视频在线观看| 亚洲人成绝费网站色www| 欧美大片在线观看一区二区| 久久久久五月天| 久久精品国产91精品亚洲| 午夜精品久久99蜜桃的功能介绍| 99精品视频免费| 日韩视频免费在线观看| 亚洲第一精品在线| 在线观看欧美| 在线精品视频一区二区三四| 今天的高清视频免费播放成人| 国产欧美一区二区三区另类精品 | 美女诱惑一区| 欧美第一黄色网| 欧美电影资源| 欧美日韩国产综合视频在线观看| 欧美国产日韩亚洲一区| 欧美国产高潮xxxx1819| 欧美精品手机在线| 欧美日韩直播| 国产精品午夜在线| 国产亚洲视频在线| 国产视频丨精品|在线观看| 国产在线不卡| 亚洲国产成人在线| 一区二区久久久久久| 亚洲一区二区高清视频| 午夜久久一区| 久久亚洲美女| 亚洲国产一成人久久精品| 亚洲精品在线观| 亚洲一区二区三区精品在线观看| 亚洲欧美卡通另类91av| 久久精品亚洲一区二区| 欧美xx视频| 国产精品亚洲人在线观看| 国产一区在线视频| 亚洲欧洲在线看| 亚洲欧美在线视频观看| 麻豆精品在线播放| 日韩一区二区免费看| 亚洲综合日韩在线| 久久人91精品久久久久久不卡| 欧美日韩精品在线| 国模私拍一区二区三区| 亚洲激情在线观看视频免费| 亚洲字幕一区二区| 欧美99久久| 亚洲免费人成在线视频观看| 久久夜色精品一区| 欧美性一区二区| 亚洲国产精品久久久久秋霞蜜臀| 亚洲欧美国产高清| 欧美高清不卡| 午夜精品久久久久99热蜜桃导演| 欧美大色视频|