gpt4 book ai didi

c - C语言如何获取Lua函数的复杂参数?

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:52 24 4
gpt4 key购买 nike

我的 Lua 函数会调用 C 函数,其中一个非常复杂,如下所示,如何获取 C 中的所有参数?参数colors是一个{color, x, y}结构类型元素的数组,它有不确定的个数。参数region{x, y, width, height} 结构类型。

/* the function in Lua:
findColors {
colors={{#FFFFFF,0.0,0.0},
{#EEEEEE,30.0,30.0},
{#DDDDDD,20.0,40.0}},
count=1,
region={10, 20, 100, 200}
}
*/


typedef struct {
int color;
int x;
int y;
} pixel_t;

static int findColorsProxy(lua_State *L)
{
lua_settop(L, 1);
luaL_checktype(L, 1, LUA_TTABLE);

lua_getfield(L, 1, "colors");
lua_getfield(L, 1, "count");
lua_getfield(L, 1, "region");

int colors_count = (int)lua_rawlen(L, -3);
if (colors_count == 0) return 0;

pixel_t *ps = NULL;
for (int i = 0; i < colors_count; lua_pop(L, 1))
{
pixel_t *p_new = (pixel_t *)realloc(ret, sizeof(pixel_t));
if (p_new == NULL) {
if (ps != NULL) free(ps);
return 0;
}


lua_rawgeti(L, 4, ++i);

... // I don't know what should I do next to get the pixels.
}


int count = (int)luaL_optinteger(L, -2, 0);

int region_args_count = (int)lua_rawlen(L, -1);
if (region_args_count != 0 && region_args_count != 4) return 0;

region_t rg;
memset(&rg, 0, sizeof(region_t));
for (int i = 0; i < region_args_count; lua_pop(L, 1))
{
lua_rawgeti(L, 4, ++i);
int c = (int)luaL_checkinteger(L, -1);

switch (i-1) {
case 0:
rg.x = c;
case 1:
rg.y = c;
case 2:
rg.width = c;
case 3:
rg.height = c;
}
}

lua_pop(L, 3);

......
}

最佳答案

我要做的是将 pixel_t 的处理逻辑从 lua 表中分离到一个单独的函数中。这将使代码更易于理解和推理。类似于 lua_topixel_t 遵循 lua 的 C api 签名约定:

bool lua_topixel_t(lua_State *L, int t, pixel *p)
{
if (lua_type(L, t) != LUA_TTABLE) return false;
if (!p) return false;

int i = 0;
lua_rawgeti(L, t, ++i);
p->color = lua_tointeger(L, -1);
lua_rawgeti(L, t, ++i);
p->x = lua_tointeger(L, -1);
lua_rawgeti(L, t, ++i);
p->y = lua_tointeger(L, -1);

lua_pop(L, i);
return true;
}

现在只需在您的 findColorsProxy 中使用它即可:

pixel_t *ps = (pixel_t *) malloc(sizeof(pixel_t) * colors_count);
for (int i = 0; i < colors_count; lua_pop(L, 1))
{
// ..., -3 = colors, count, region
lua_rawgeti(L, -3, ++i);
// ..., colors, count, region, -1 = color[i]
if (!lua_topixel_t(L, -1, &ps[i - 1]))
{
free(ps); return 0;
}
}
// ...

请注意,我不确定您是如何从 lua 端表示 rgb 颜色的,所以在这里我只是假设它是一个整数。如果表示不同,例如 lua 字符串,请适当修改 lua_topixel_t

关于c - C语言如何获取Lua函数的复杂参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27578833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com