Библиотека Lua - возвращение массива в lua из C - PullRequest
6 голосов
/ 11 августа 2011

Я не уверен, правильно ли отражает заголовок мой вопрос.

У меня есть библиотека, реализованная на C для lua, предоставленная мне моим работодателем. Они читают кучу данных с устройства Modbus, так что:

readFunc(Address, numReads) 

начнется с адреса и будет считывать numRead количество регистров. В настоящее время это возвращает данные следующим образом:

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

Однако для некоторых наших функций нам нужно выполнять 32+ чтения за раз, и я действительно не хочу, чтобы в моем коде каждый раз появлялись answer1, reply2 ... reply32 +. В идеале я хотел бы сделать что-то вроде:

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

где array_of_awesome_data [1] будет соответствовать A, как мы это делаем сейчас. В текущем C-коде, который мне дали, все данные возвращаются в цикле:

lua_pushinteger(L, retData);

Как мне отрегулировать реализованную на Си библиотеку lua, чтобы функция lua возвращала массив?

Примечание: цикл многократных чтений на нашем устройстве слишком неэффективен, поэтому нам нужно сделать 1 большое чтение. Я не знаю достаточно деталей, чтобы обосновать причину, но это то, что мне сказали.

1 Ответ

6 голосов
/ 12 августа 2011

В 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 */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...