Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6897621
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 27, 20262026-05-27T07:11:32+00:00 2026-05-27T07:11:32+00:00

I want to pass a table from Lua to C and then access all

  • 0

I want to pass a table from Lua to C and then access all the values in C without copying the values from Lua address space to C stack. Is there a way of doing this?? I want to minimize the copy of values.

I tried using gettable() but in that case, the value is copied onto top of stack. So a copy is getting generated. I don’t want this. Is there any other way??

Here is my C code:-

#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;
}

I generated a shared library by compiling this program using the following command:-

gcc -Wall -shared -fPIC -o power.so -I/usr/local/include/lua5.1 -llua5.1 quicksort.c

Here is the Lua code for calling this:-

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

Thanks

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-27T07:11:32+00:00Added an answer on May 27, 2026 at 7:11 am

    The C API for Lua only copies low-level C types, such as numbers and booleans. For all others, including strings, it uses pointers to internal Lua data.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I want to pass a list containing numbers from Lua to C and access
How would I pass a table of unknown length from Lua into a bound
I need to take find all unique values from the below and pass them
I have two tables and want to insert some column values from ane table
I have users(user,pass,email) table and I want to get the count of user where
I want to pass two variable at a time from one page to another
I have a Inline table valued Function that i want to pass a column
I want to run a query like this in MySQL: select * from table
I am using a table inside a repeater. Basically I want to pass to
I am new to hibernate . I want to pass 2 column values and

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.