Я хочу передать таблицу из Lua в C, а затем получить доступ ко всем значениям в C, не копируя значения из адресного пространства Lua в стек C.Есть ли способ сделать это ??Я хочу минимизировать копию значений.
Я пытался использовать gettable (), но в этом случае значение копируется в верхнюю часть стека.Таким образом, копия генерируется.Я не хочу этогоЕсть ли другой способ ??
Вот мой код C: -
#include <lua.h> /* Always include this */
#include <lauxlib.h> /* Always include this */
#include <lualib.h> /* Always include this */
#include <malloc.h>
#define EXCEPTION_IS_NUMBER (-2) //Passed a custom error no. to be returned in
//case of error
#define SUCCESS (0)
static int iquicksort(lua_State *L) {
int k,len=0;
len=lua_tointeger(L,-2); //-2 specifies second element from top of stack.
//So I have passed 2 elements from Lua to C, first
//is size of table and second table. So when they
//are pushed to stack, the size is second element
//from top.So here I am storing it in variable len.
int *q;
int *p=(int *)malloc(len*sizeof(int));
q=p;
for(k=1;k<=len;k++)
{
lua_pushinteger(L,k); //if I want to access a[2], where a is my table
//and 2 is the index, then '2' needs to be at top
//of the stack and I need to pass the location of
//'a' in stack as second argument to gettable().
//So here Address of table was at top, I pushed
//the index on top, now address is second element
//from top. So I passed it as '-2' in gettable
//below. What gettable() does is that it fetches
//and copies that value at stack top. So I can
//use it from there.
lua_gettable(L,-2);
if(lua_isnumber(L,-1)) //Checking top value replaced by fxn is number...
{
*p++=lua_tointeger(L,-1); //Storing the values in array
}
else
{
lua_pushinteger(L,EXCEPTION_IS_NUMBER);
return 1;
}
lua_pop(L,1);
}
p=q;
sort(p,0,len-1);
for(k=1;k<=len;k++) //This fxn changes the value at prescribed location of table.
//here I am changing the values at Table's location...
//i.e. storing the sorted values in table.....
{
lua_pushinteger(L,k);
lua_pushinteger(L,*p++);
lua_settable(L,-3);
}
lua_pushinteger(L,SUCCESS);
return 1;
}
//Simple quicksort of values.....
void sort(int *arr, int left,int right){
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
/* partition */
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
};
/* recursion */
if (left < j)
sort(arr, left, j);
if (i < right)
sort(arr, i, right);
}
int luaopen_power(lua_State *L){
lua_register(L,"quicksort",iquicksort);
return 0;
}
Я создал общую библиотеку, скомпилировав эту программу с помощью следующей команды: -
gcc -Wall -shared -fPIC -o power.so -I/usr/local/include/lua5.1 -llua5.1 quicksort.c
Вот код Lua для вызова этого: -
require("power")
x={5,4,6,5,3,2,3,9}
print("Before quicksort call....")
t=quicksort(#x,x)
if t==0 then
for i,v in ipairs(x) do print(i,v) end
else
print(string.format("%s %d","Error occurred. Errorcode is:: ",t))
end
Спасибо