2011-08-11 8 views
4

タイトルに自分の質問が正しく反映されているかどうかわかりません。Luaライブラリ - Cからluaの配列を返す

私は、私の雇用主から私に提供されたlua用のC言語で実装されたライブラリを持っています。 彼らはそれがModbusデバイスからのデータの束を読んで持っているよう:

readFunc(Address, numReads) 

はアドレスで開始し、読み込みますnumReadレジスタの量を。現在、これには、以下の方法でデータを返します。

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

しかし、我々は32+行う必要があるが、当社の機能のいくつかの時間で読み、私は本当にreply1を持ってしたくない、reply2 ... reply32 +記載されています私のコードで毎回これを行う。 array_of_awesome_dataは、[1]、我々は今それを行う方法で、に相当するであろう

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

: は理想的には、私のような何かをしたいと思います。

lua_pushinteger(L, retData); 

がどのように私はLuaの関数は配列を返すことができるように、C実装Luaのライブラリを調整については行くだろう:私は与えられた現在のCコードで は、各データはループで返されますか?

注:複数の読み込みのループは、私たちのデバイスではあまりにも非効率的であるため、1つの大きな読み込みを行う必要があります。私は理由を正当化するのに十分な詳細を知らないが、それは私に言われたことである。 Luaので

答えて

5

、あなたはリストを受け取ることができます例えば、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)}'だけでもできます。 –