2011-08-11 41 views
4

我不確定標題是否正確地反映了我的問題。Lua庫 - 從C返回一個數組在lua中

我有一個圖書館爲Lua實施了lua,由我的僱主提供給我。 他們有它讀了一堆數據出來Modbus設備的這樣:

readFunc(Address, numReads) 

將地址開始讀numRead寄存器的數量。目前,此方法返回下列方式數據:

A, B, C, D = readFunc(1234, 4) 

但是,我們需要做的32+同時讀取我們的一些功能,我真的不希望有REPLY1,REPLY2 ... reply32 +上市在我的代碼中,每次我這樣做。 理想情況下,我想這樣做:

array_of_awesome_data = {} 
array_of_awesome_data = readFunc(1234, 32) 

其中array_of_awesome_data [1]將對應到A,我們現在做的方式。

lua_pushinteger(L, retData); 

我如何去調整C語言實現LUA庫允許LUA函數返回一個數組: 在當前的C代碼,我得到了,每個數據是在一個循環回來了?

注意:多次讀取的循環在我們的設備上效率太低,因此我們需要執行1次大的讀取。我不知道足夠的細節來證明爲什麼,但這是我被告知的。

回答

5

在Lua中,你可以得到一個列表使用table.pack從一個函數返回,例如:

array_of_awesome_data = table.pack(readFunc(1234, 32)) 

或者在C,如果你想返回一個表,而不是結果的列表中,您需要先將表推入堆棧,然後將堆棧中的每個項目推入並將其添加到表格中。它會有如下內容:

num_results=32; /* set this dynamically */ 
lua_createtable(L, num_results, 0); 
for (i=0; i<num_results; i++) { 
    lua_pushinteger(L, retData); 
    lua_rawseti (L, -2, i); 
} 

注意:這些代碼都沒有經過測試。

+0

這是一個絕妙的主意,不涉及更改API。我沒有想到,但它應該做我所需要的。我會讓你知道的,謝謝! :) 爲了知識,你知道在C實現中是否有辦法做到這一點? – Sambardo

+0

@Sambardo:更新了C中的選項。希望有所幫助。 – BMitch

+6

你也可以只做'{readFunc(1234,32)}'。 –