高速掌握Lua 5 3 擴充套件你的程式 1

2021-09-07 13:52:17 字數 3777 閱讀 3713

a:

「config.lua」檔案裡:

-- window size

width = 200

height = 300

「main.c」檔案裡:

#include 

#include

#include

#include

#include

#include

void error(lua_state *l, const

char *fmt, ...)

void load(char *filename, int *width, int *height) int main(void)prompt> gcc main.c -llua

-ldl

-lm-wall

prompt>

./a.out

width =

200, height =

300

看完這個樣例是否會認為使用lua作為配置檔案語言有些不值?只為了獲取兩個變數的值,卻寫了這麼一大段**。

可是使用lua確實有其優勢。

首先lua承擔了配置檔案格式檢查的工作,假設你自己寫解析程式。這一段**不會少;其次。你能夠在配置檔案裡寫凝視,相同假設你自己寫解析程式,也須要考慮跳過凝視的問題;最後。配置檔案裡能夠做很多其它的靈活配置。比方,

-- 依據環境變數,靈活的定義窗體大小。

ifos.getenv("display") == "small"

then

width = 100

height = 100

else

width = 500

height = 500

end

-- window size.

width = 200

height = 300

-- window's background color.

-- 配置檔案裡能夠自定義顏色。

orange = --background = orange

--background = background = "blue" -- 也能夠直接使用c中定義的顏色。「main.c」檔案裡:

#include 

#include

#include

#include

#include

#include

#include

#define max_color 255 // 顏色分量的最大值。

struct colortable colortable = , , , , , // sentinel }; void error(lua_state *l, const char *fmt, ...) void setfield(lua_state *l, const char *index, int value) // 獲取"table"中元素"key"的值(此函式假設"table"在棧頂)。

int getfield(lua_state *l, const char *key) void setcolor(lua_state *l, struct colortable *ct) void load(lua_state *l, char *filename, int

*width, int

*height, int

*r, int

*g, int

*b) lua_getglobal(l, "width"); lua_getglobal(l, "height"); lua_getglobal(l, "background"); // 將lua環境下名為"background"的全域性變數的值入棧。

if(!lua_isnumber(l, -3)) *width = (int)lua_tonumber(l, -3); if(!lua_isnumber(l, -2)) *height = (int)lua_tonumber(l, -2); // 假設"background"值是個字串。那麼說明使用c中定義的顏色。 if(lua_isstring(l, -1)) if(colortable[i].name == null) else } // 假設"background"值是個字串,那麼說明使用lua中定義的顏色。

else

if(lua_istable(l, -1)) else return ; } int main(void) load(l, "config.lua", &width, &height, &r, &g, &b); lua_close(l); printf("width = %d, height = %d\n"

"red = %d, green = %d, blue = %d\n", width, height, r, g, b); return

0; }

prompt> gcc main.c -llua

-ldl

-lm-wall

prompt>

./a.out

width =

200, height =

300red =

0, green =

0, blue =

255

1、

/* int lua_pcall(lua_state *l, int nargs, int nresults, int msgh)

* 以保護模式呼叫具有"nargs"個引數,"nresults"個返回值得函式。

函式在第乙個引數的前乙個位置。 * 保護模式指的是當呼叫出錯時不會報錯,而是返回乙個錯誤碼同一時候將錯誤資訊入棧。

* 當呼叫成功時,函式返回0。將函式名以及引數出棧,之後將函式的返回值入棧。 * 不管函式返回多少個返回值,lua會調整為你須要的數量,忽略多餘的或者將不夠的補為"nil"。 * 當呼叫出錯時,函式返回非0值。將函式名以及引數出棧, * 以錯誤資訊作為引數,執行虛擬棧中索引"msgh"處的出錯處理函式, * 將出錯處理函式的返回值作為"lua_pcall"的返回值入棧。

* "msgh"為0代表沒有錯誤處理函式,錯誤處理函式必須要在被呼叫函式和其引數入棧之前入棧。

* 典型的使用方法中,錯誤處理函式被用來給錯誤訊息加上很多其它的除錯資訊,比方棧跟蹤資訊。

* 這些資訊在"lua_pcall"返回後。因為棧已經展開,所以收集不到了。 * lua_pcall 函式會返回下列常數(定義在"lua.h"內)中的乙個: lua_ok (0): 成功。 lua_errrun: 執行時錯誤(一般錯誤)。

lua_errmem: 記憶體分配錯誤(此種情況,lua不會呼叫錯誤處理函式)。 lua_errerr: 在執行錯誤處理函式時發生的錯誤(此種情況。lua不會再次呼叫錯誤處理函式)。 lua_errgcmm: 在執行"__gc"元方法時發生的錯誤(這個錯誤和被呼叫的函式無關。)。

*/

快速掌握Lua 5 3 從Lua中呼叫C函式

a 1 程式主體在c中執行,c函式註冊到lua中。c呼叫lua,lua呼叫c註冊的函式,c得到函式的執行結果。2 程式主體在lua中執行,c函式作為庫函式供lua使用。第一種方式看起來很羅嗦,也很奇怪。既然程式主體執行在c中,而且最終使用的也是c中定義的函式,那麼為何要將函式註冊給lua,然後再通過...

Lua5 3遇到的坑

attempt to call a nil value global unpack 在lua 5.2和5.3的版本中,全域性的unpack函式已經被移除了,改為table.unpack,所以如果用到的第三方庫或者源 使用了unpack方法,可以在 前面加上 local unpack unpack o...

快速掌握Lua 5 3 兩個完整的例子

將lua指令碼作為乙個小型的簡化版的 資料庫 展現了如何簡單高效的將這個 資料庫 中的資料轉化為網頁顯示。db.lua 檔案中內容。這裡看似是一張名為 entry 的表中儲存了許多資料,實際上在轉化程式中這時乙個名為 entry 的函式,引數是下面這個儲存了許多資料的 table 還記得 foo 與...