硬汉嵌入式论坛

 找回密码
 立即注册
查看: 38|回复: 0
收起左侧

[Lua] LUA的大批量数据返回,推荐使用lua_newtable(L),比单纯使用lua_pushnumber节省内存

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119430
QQ
发表于 昨天 10:18 | 显示全部楼层 |阅读模式



备份个可用的测试代码

[C] 纯文本查看 复制代码
int getdata(lua_State* L) {
    // 参数检查
    if (lua_gettop(L) != 2 || !lua_istable(L, 1) || !lua_isnumber(L, 2)) {
        return luaL_error(L, "usage: getdata(table, count)");
    }
    
    int count = lua_tointeger(L, 2);
    
    // 安全限制
    if (count > 1000) count = 1000;
    if (count < 0) count = 0;
    
    // 第一阶段:收集所有数据到临时数组,同时清空栈
    double* temp_values = (double*)malloc(count * sizeof(double));
    if (temp_values == NULL) {
        return luaL_error(L, "memory allocation failed");
    }
    
    for (int i = 1; i <= count; i++) {
        lua_rawgeti(L, 1, i);  // 获取table[i]
        
        if (lua_isnumber(L, -1)) {
            temp_values[i-1] = lua_tonumber(L, -1);
        } else {
            temp_values[i-1] = 0.0;  // 非数字默认为0.0
        }
        
        lua_pop(L, 1);  // 立即pop,保持栈清洁
    }
    
    // 此时栈应该只有最初的2个参数
    // 清空栈,只保留我们需要的结果
    lua_settop(L, 0);
    
    // 第二阶段:创建结果table并填充数据
    lua_newtable(L);
    
    for (int i = 0; i < count; i++) {
        lua_pushnumber(L, temp_values[i]);
        lua_rawseti(L, -2, i + 1);
    }
    
    // 释放临时数组
    free(temp_values);
    
    return 1;  // 返回table
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-11-22 00:24 , Processed in 0.035230 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表