本文目錄一覽:
- 1、調用一個動態庫中的函數,這個函數有一個參數是結構體指針,我如何使用這個指針?
- 2、lua如何對外輸出數據,相關函數有哪些?
- 3、Lua5.3 module 函數怎麼使用
- 4、求問大神,luaL_Reg怎麼用啊
- 5、怎麼把如下php代碼寫成lua代碼?
- 6、LUA 讀取C#中返回值為數組的函數
調用一個動態庫中的函數,這個函數有一個參數是結構體指針,我如何使用這個指針?
你就也定義一個形參中的結構體指針接收傳過來的結構體指針就OK啦
形參中的結構體指針改變?這什麼意思?
給你看個例子吧:
struct node *creat(struct node *l)
{
struct node *head;
head=l;
return head;
}
你是這樣嗎~
lua如何對外輸出數據,相關函數有哪些?
1.使用接口方式,用戶代入用戶名和密碼進入取數據
這是一個攜帶有有關函數或活動記錄的各種信息的結構。 lu a_getstack 只會填充結構的私有部分供後面使用。 調用 lu a_getinfo 可以在 lu a_Debug 中填充那些可被使用的信息域。
下面對 lu a_Debug 的各個域做一個說明:
2.source: 創建這個函數的代碼塊的名字。 如果 source 以 ‘@’ 打頭, 指這個函數定義在一個文件中,而 ‘@’ 之後的部分就是文件名。 若 source 以 ‘=’ 打頭, 剩餘的部分由用戶行為來決定如何表示源碼。 其它的情況下,這個函數定義在一個字符串中, 而 source 正是那個字符串。
short_src: 一個「可打印版本」的 source ,用於出錯信息。
linedefined: 函數定義開始處的行號。
lastlinedefined: 函數定義結束處的行號。
3.what: 如果函數是一個 Lu a 函數,則為一個字符串 “L ua” ; 如果是一個 C 函數,則為 “C”; 如果它是一個代碼塊的主體部分,則為 “main”。
currentline: 給定函數正在執行的那一行。 當提供不了行號信息的時候, currentline 被設為 -1 。
name: 給定函數的一個合理的名字。 因為 L ua 中的函數是一等公民, 所以它們沒有固定的名字: 一些函數可能是全局複合變量的值, 另一些可能僅僅只是被保存在一張表的某個域中。 lua _getinfo 函數會檢查函數是怎樣被調用的, 以此來找到一個適合的名字。 如果它找不到名字, name 就被設置為 NULL 。
4.namewhat: 用於解釋 name 域。 namewhat 的值可以是 “global”, “local”, “method”, “field”, “upvalue”, 或是 “” (空串)。 這取決於函數怎樣被調用。 (Lu a 用空串表示其它選項都不符合。)
istailcall: 如果函數以尾調用形式調用,這個值就為真。 在這種情況下,當層的調用者不在棧中。
nups: 函數的上值個數。
nparams: 函數固定形參個數 (對於 C 函數永遠是 0 )。
isvararg: 如果函數是一個可變參數函數則為真 (對於 C 函數永遠為真)。
5.沒有內置的調試機制。 但是它提供了一組特殊的函數接口以及 鉤子。 這組接口可用於構建出不同的調試器、性能剖析器、 或是其它需要從解釋器獲取「內部信息」的工具。
6.通常,這個函數不會返回; 當協程一次次延續,將從延續函數繼續運行。 然而,有一個例外: 當這個函數從一個逐行運行的鉤子函數(參見) 中調用時,l ua_yieldk 不可以提供延續函數。 (也就是類似 lu a_yield 的形式), 而此時,鉤子函數在調用完讓出後將立刻返回。 L ua 會使協程讓出,一旦協程再次被延續, 觸發鉤子的函數會繼續正常運行。
7.當一個線程處於未提供延續函數的 C 調用中,調用它會拋出一個錯誤。 從並非用延續方式(例如:主線程)啟動的線程中調用它也會這樣。
Lua5.3 module 函數怎麼使用
1.編寫一個簡單的模塊
Lua的模塊是什麼東西呢?通常我們可以理解為是一個table,這個table里有一些變量、一些函數…
等等,這不就是我們所熟悉的類嗎?
沒錯,和類很像(實際上我說不出它們的區別)。
我們來看看一個簡單的模塊,新建一個文件,命名為game.lua,代碼如下:
複製代碼代碼如下:
game = {}
function game.play()
print(“那麼,開始吧”);
end
function game.quit()
print(“你走吧,我保證你不會出事的,呵,呵呵”);
end
return game;
我們定義了一個table,並且給這個table加了兩個字段,只不過這兩個字段的值是函數而已。
至於如何使用模塊,那就要用到我們之前介紹過的require了。
我們在main函數里這麼使用:
複製代碼代碼如下:
local function main()
cc.FileUtils:getInstance():addSearchPath(“src”)
game = require(“game”);
game.play();
end
注意,我們要require其他文件的時候,要把文件路徑給設置好,否則會找不到文件。
因為我使用的是Cocos Code IDE,直接調用addSearchPath函數就可以了,我的game.lua文件是在src目錄下的。
好了,運行代碼,結果如下:
複製代碼代碼如下:
[LUA-print] 那麼,開始吧
OK,這就是一個很簡單的模塊,如果我們習慣了Java、C++等面向對象語言,那也可以簡單地把模塊理解為類。
求問大神,luaL_Reg怎麼用啊
擴展Lua的基本方法之一就是為應用程序註冊新的C函數到Lua中去。
當我們提到Lua可以調用C函數,不是指Lua可以調用任何類型的C函數(有一些包可以讓Lua調用任意的C函數,但缺乏便捷和健壯性)。正如我們前面所看到的,當C調用Lua函數的時候,必須遵循一些簡單的協議來傳遞參數和獲取返回結果。相似的,從Lua中調用C函數,也必須遵循一些協議來傳遞參數和獲得返回結果。另外,從Lua調用C函數我們必須註冊函數,也就是說,我們必須把C函數的地址以一個適當的方式傳遞給Lua解釋器。
當Lua調用C函數的時候,使用和C調用Lua相同類型的棧來交互。C函數從棧中獲取她的參數,調用結束後將返回結果放到棧中。為了區分返回結果和棧中的其他的值,每個C函數還會返回結果的個數(the function returns (in C) the number of results it is leaving on the stack.)。這兒有一個重要的概念:用來交互的棧不是全局變量,每一個函數都有他自己的私有棧。當Lua調用C函數的時候,第一個參數總是在這個私有棧的index=1的位置。甚至當一個C函數調用Lua代碼(Lua代碼調用同一個C函數或者其他的C函數),每一個C函數都有自己的獨立的私有棧,並且第一個參數在index=1的位置。
26.1 C 函數
先看一個簡單的例子,如何實現一個簡單的函數返回給定數值的sin值(更專業的實現應該檢查他的參數是否為一個數字):
static int l_sin (lua_State *L) {
double d = lua_tonumber(L, 1);/* get argument */
lua_pushnumber(L, sin(d));/* push result */
return 1;/* number of results */
}
任何在Lua中註冊的函數必須有同樣的原型,這個原型聲明定義就是lua.h中的lua_CFunction:
typedef int (*lua_CFunction) (lua_State *L);
從C的角度來看,一個C函數接受單一的參數Lua state,返回一個表示返回值個數的數字。所以,函數在將返回值入棧之前不需要清理棧,函數返回之後,Lua自動的清除棧中返回結果下面的所有內容。
我們要想在Lua使用這個函數,還必須首先註冊這個函數。我們使用lua_pushcfunction來完成這個任務:他獲取指向C函數的指針,並在Lua中創建一個function類型的值來表示這個函數。一個quick-and-dirty的解決方案是將這段代碼直接放到lua.c文件中,並在調用lua_open後面適當的位置加上下面兩行:
lua_pushcfunction(l, l_sin);
lua_setglobal(l,”mysin”);
第一行將類型為function的值入棧,第二行將function賦值給全局變量mysin。這樣修改之後,重新編譯Lua,你就可以在你的Lua程序中使用新的mysin函數了。在下面一節,我們將討論以比較好的方法將新的C函數添加到Lua中去。
對於稍微專業點的sin函數,我們必須檢查sin的參數的類型。有一個輔助庫中的luaL_checknumber函數可以檢查給定的參數是否為數字:當有錯誤發生的時候,將拋出一個錯誤信息;否則返回作為參數的那個數字。
怎麼把如下php代碼寫成lua代碼?
base64需要自己找個庫調用一下,其他部分實現了,下面是代碼
local function decode(str, skey)
str = str or “”
skey = skey or “cxphp”
local replaceStr = string.gsub(str, “O0O0O”, “=”)
replaceStr = string.gsub(replaceStr, “o000o”, “+”)
replaceStr = string.gsub(replaceStr, “oo00o”, “/”)
local strArr = {}
local replaceStrLen = string.len(replaceStr)
for pos = 1, replaceStrLen, 2 do
local posEnd = math.min(pos + 1, replaceStrLen)
strArr [#strArr + 1] = string.sub(replaceStr, pos, posEnd)
end
local strCount = #strArr
for key = 1, string.len(skey) do
local value = string.sub(skey, key, key)
print(key, value, strArr[key], string.sub(strArr[key], 2, 2))
if key = strCount and strArr[key] and string.sub(strArr[key], 2, 2) == value then
strArr[key] = string.sub(strArr[key], 1, 1)
end
end
local needToDecode = table.concat(strArr)
print(needToDecode)
— TODO: find a lib base64_decode
end
LUA 讀取C#中返回值為數組的函數
返回數組給lua並不是這樣吧,應該是返回一個 table
我記得應該是
lua_newtable
然後往這個table里插入。
還有你確定你這個C#的函數註冊了嗎。我記得註冊到lua里的函數定義應該不是這樣的
函數應該是返回一個 int 值,表示該函數返回多少個返回值。
//定義一個C函數
//如這個函數,返回 1 一個返回值,值為 9
int Test(lua_State* l)
{
lua_pushinteger(l, 9);
return 1;
}
//將這個函數註冊到 lua 內
lua_register(L, “Test”, Test);
這樣 lua 內就可以使用
local k = Test()
結果 k = 9
原創文章,作者:XGUV,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/149450.html