最近為了解決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...