向lua中註冊php函數,lua調用php

本文目錄一覽:

調用一個動態庫中的函數,這個函數有一個參數是結構體指針,我如何使用這個指針?

你就也定義一個形參中的結構體指針接收傳過來的結構體指針就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-hant/n/149450.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
XGUV的頭像XGUV
上一篇 2024-11-05 16:52
下一篇 2024-11-05 16:52

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29

發表回復

登錄後才能評論