c++ 当C函数接受多个输入时,将Lua数组转换为C数组

v8wbuo2f  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(74)

我试图弄清楚Lua和C之间的交互,其中C函数接受多个输入,其中一个是Lua数组。StackOverflow上的其他文章只介绍了传入C的数组,其中C代码使用-1来索引数组。

**注1:**我不是LuaMaven。
**注2:**我提到其他职位不包括指数的复杂性。我在下面提供了一个解决方案,它涵盖了它,并使它清楚。不要在没有理解整个上下文的情况下标记它。许多人可能不喜欢我的Note 2,但许多用户知道标记是一个问题。

Lua

name = "id string"
random_array = {1.2, 1.3, 1.4}
c_function(name, random_array, 3) -- 3 is the size of array.

C

static int c_function(lua_State* L)
{
    const char* name = luaL_checkstring(L, 1);
    int size = luaL_checkinteger(L, 3);
    double data[size];

    // How do I get array values from 'L' into 'data'?

    Calculate(name, data, size);
    return 0;
}

void Calculate(const char* name, double* data, int size)
{
    // Existing function which acts on the data.
    // This function cannot change.
}
2fjabf4q

2fjabf4q1#

根据@Barmar提供的链接和一些玩耍,下面是一个工作解决方案,任何人谁可能遇到这个问题。要使索引正确,需要一些反复试验,所以希望这能在未来节省人们的时间。基于Lua 5.4:
Lua

name = "id of entry"
array1 = {1.1, 1.2, 1.3}
array2 = {2.1, 2.2, 2.3, 2.4}

c_function(name, array1, array2)

C/C++

static int c_function(lua_State* L)
{
    const char* name = luaL_checkstring(L, 1);
    
    std::vector<double> arr1;
    std::vector<double> arr2;

    // array1 - pay attention to use of 2, -1 and 1.
    if (lua_istable(L, 2) != 0)
    {
        unsigned int size = lua_rawlen(L, 2);
        arr1.resize(size);
        
        for (unsigned int i = 0; i < size; i++)
        {
            lua_rawgeti(L, 2, i + 1); // Lua uses 1 based indices.
            arr1[i] = lua_tonumber(L, -1);
            lua_pop(L, 1);
        }
    }

    // array2 - pay attention to use of 3, -1 and 1.
    if (lua_istable(L, 3) != 0)
    {
        unsigned int size = lua_rawlen(L, 3);
        arr2.resize(size);
        
        for (unsigned int i = 0; i < size; i++)
        {
            lua_rawgeti(L, 3, i + 1); // Lua uses 1 based indices.
            arr2[i] = lua_tonumber(L, -1);
            lua_pop(L, 1);
        }
    }

    Calculate(name, arr1, arr2);

    return 0;
}

void Calculate(const char* name, const std::vector<double>& arr1, const std::vector<double>& arr2)
{
    // Do stuff here.
}

相关问题