Lua库——从C中返回Lua数组

6

我不确定标题是否正确反映了我的问题。

我的雇主为我提供了一个用于lua的C库,它可以从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)

现在的C代码是通过循环返回每个数据,其中array_of_awesome_data[1]对应于我们现在使用的A。

lua_pushinteger(L, retData);

我该如何调整一个C实现的lua库,以允许lua函数返回数组?

注意:在我们的设备上,多次循环读取数据效率太低,因此我们需要进行一次大的读取。我不知道具体细节,但这是我被告知的。

1个回答

6
在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[i]);
  lua_rawseti (L, -2, i+1); /* In lua indices start at 1 */
}

这是一个很棒的想法,不需要改变API。我之前没有想到过,但它应该正好满足我的需求。我会告诉你的,谢谢! :)为了增加知识,您知道是否有一种方法在C实现中完成它吗? - Sambardo
@Sambardo:已更新为C语言选项。希望能有所帮助。 - BMitch
最终我使用了table.pack,然后转换为Nicol Bolas的{...}符号表示法。谢谢你们两位的帮助,我将C部分发送给API的创建者以备将来参考。 - Sambardo
rawseti的索引是从0开始还是在参数中应该是i+1? - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接