Я пытаюсь обернуть функцию C, которая создает массив с плавающей точкой, а затем возвращает этот массив в виде таблицы Lua, чтобы его можно было использовать в Lua.
Вот функция C, которая возвращает массив с 4 элементами.
static void getArray(int size, float values[4]) {
for (int i=0; i<size; ++i)
values[i] = (float)i;
}
И это часть набора файлов в файле .i.
// using typemaps
%include <typemaps.i>
%apply (float OUTPUT[ANY]) {(float values[4])};
А в Lua я могу использовать функцию следующим образом:
arr = my.getArray(4); //table "arr" is now {0,1,2,3}
Хотя это работает нормально, мне интересно, возможно ли создать функцию C, которая может возвращать изменяемый массив с плавающей точкой.
Поэтому я думаю, что функция будет выглядеть следующим образом.
static void getArray(int size, float **values) {
//create a float array and then return this as a table in Lua.
}
Однако я не знаю, как связать эту функцию с интерфейсом SWIG (.i).
Я перепробовал все, что мог, но пока не смог заставить его работать.
МожетКто-нибудь, пожалуйста, сообщите мне, как обернуть эту функцию с помощью SWIG, чтобы я мог вернуть изменяемый массив с плавающей точкой в виде таблицы в Lua?
PS: Вот ссылка на документацию Lua SWIG.http://www.swig.org/Doc1.3/Lua.html
------------------------ ДОБАВЛЕНО НИЖЕ ------------------------
@ Flexo Основываясь на вашем обновленном решении, я мог успешно связать функцию getArray
, которая выглядит следующим образом.
static void getArray(const string &name, int *size, t_word **values) {
t_garray *a;
int vecsize;
t_word *vec;
if (getArrayData(name, &a, &vecsize, &vec)) {
*values = vec;
*size = vecsize;
}
}
И это мой SWIG-интерфейс.
%typemap(in,numinputs=0) (int *size, t_word **values) (t_word *tmp=NULL, int tsize=0) %{
$2 = &tmp; // Use the temporary we setup
$1 = &tsize;
%}
%typemap(argout) (int *size, t_word **values) {
int i;
lua_newtable(L);
for (i = 0; i < *$1; i++){
lua_pushnumber(L,(lua_Number)(*$2)[i].w_float);
lua_rawseti(L,-2,i+1);/* -1 is the number, -2 is the table*/
}
SWIG_arg++;
}
t_word
- это структура, используемая для массива с плавающими данными w_float
.
Мне не нужно было ничего освобождатьпоскольку я не выделил новую память, и она, кажется, работает как шарм.
Большое спасибо за вашу помощь.Я многому научился из вашего кода.