C C 與lua二維陣列互動的經典範例

2021-10-07 19:58:35 字數 1496 閱讀 2507

最近為了解決skynet的跑得快ai的核心演算法效能問題,那麼我們自然就用c來寫核心演算法,之前從來沒做過二維陣列互動,也是折騰了一番才能正常理解與執行。先看示例**

//陣列計算加一返回陣列

int getcardcal(lua_state* l)

; lua_pushnil(l);

int index = lua_gettop(l)-1;

lual_checktype(l, index, lua_ttable); //檢測傳遞過來的是否為table

int indexa = 0;

while (lua_next(l, index))

indexa++;

lua_pop(l, 1); // pop value

} for (int i = 0; i < 20;i++)

}} lua_newtable(l);

lua_newtable(l);

int arrayindex1 = 1;

for (int i = 0; i < 20; i++)

lua_newtable(l);

int arrayindex2 = 1;

for (int j = 0; j < 20; j++)

}lua_rawseti(l, -2, arrayindex1++);

} return 1;

}

測試用例

local vecresult=,,,,,,,,}

local allsortcardcal= cardallsort.getcardcal(vecresult)

做這個之前翻看了很多用例,嘗試了很多遍才能勉強理解得了幾個關鍵函式的操作,關鍵函式lua_next(l, index)

lua_next() 這個函式的工作過程是:

1) 先從棧頂彈出乙個 key

2) 從棧指定位置的 table 裡取下一對 key-value,先將 key 入棧再將 value 入棧

3) 如果第 2 步成功則返回非 0 值,否則返回 0,並且不向棧中壓入任何值

有了這個解釋你就明白了lua_pushnil(l);為什麼寫在了前面

lua_pushinteger(l, arraynum[i][j]);

lua_rawseti(l, -2, j + 1);

兩句一起就是說要把剛放到棧頂的資料放到表裡面去,-2的位置是乙個表來的。

執行的結果圖如何

例子雖然短小,但已經充分體現了lua與c的二維陣列之間的互動,其實陣列的互動還是用c++來互動好一點,因為c++有vector,這樣就沒必要操心陣列大小,越界問題發生,同時可適用範圍,擴充套件性要比c好很多。(c++的出現就是為了解決c的這一通毛病)但老大要求與skynet風格統一,沒辦法只能用c,沒寫之前千難萬難,學會了就容容易易。

C C 二維陣列

已知在c c 中當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。1 二維陣列的概念 在c語言中,二維陣列實際上是一種特殊的一維陣列,它的每個元素也是乙個一維陣列。因此,二維陣列下標形式正確寫法如下 int arrays i j 2 二維陣列作為函式引數 傳遞陣列時必須讓編譯器知道陣列最...

C C 二維陣列的引數傳遞與二維指標

在進行函式引數傳遞的時候,常常需要把一組資料傳遞給函式,我們知道一維陣列在進行函式引數傳遞的時候,以陣列名作為形參就可以,因為陣列名就表示該陣列的首位址,在函式內部也直接可以用符號訪問。那麼二維陣列的值該如何傳遞呢?其實它可以像一維陣列那樣以陣列名作為形參和實參,也可以使用二級指標來進行傳遞,常用的...

Lua與C C 的互動

lua 從 取得 luatinker 可以從 取得 tolua 可以從 取得 關於lua與c c 的互動 c c 呼叫lua的函式還是比較簡單的,可以參考lua tinker的實現。lua呼叫c c 的函式如果用最原始的方式有很大限制,只能呼叫型別為 typedef int lua cfunctio...