领取奖励排序_Lua

功能需求:

奖励领取界面,按照某一顺序排序。已领取的排在后面,未领取的排在前面,整体按照某一从小到大的顺序。


领取奖励的item数据表table={ {id,state,},{id,state},{id,state},{id,state},{}, ,  }

function SortLsit(a,b)
    --状态相同,按照id排序
    if a.state==b.state then
        return a.id<b.id
    end

    --可领取在前
    if a.state=="可领取" then
        return true
    end

    --已领取在后
    if a.state=="已领取" then
        return false
    end

    if a.state=="未达成" then
        if b.state=="可领取" then
            return false
        else
            return true
        end
    end
end

然后,table.sort(table,SrotList)

Done.

<think>我们有一个函数 `tpApp_lua_do_luci`,它用于调用一个Lua函数(可能是通过一个表访问的函数),并处理传入参数和返回值的转换。 参数说明: - `lua_State *L`: Lua状态机,用于与Lua交互。 - `const char *fname`: 要调用的Lua函数的名字(可能是全局函数,也可能是表里的函数,根据`tpApp_lua_get_table_function`的实现而定)。 - `void *cfg`: 一个指向配置数据的指针,这个数据会被传递给`push_op`和`pop_op`操作,用于在C结构体和Lua表之间传递数据。 - `const TPAPP_LUA_TBL_OP *push_op`: 一个结构体数组,用于定义如何将C结构体中的数据压入Lua表(作为参数传递给Lua函数)。 - `const TPAPP_LUA_TBL_OP *pop_op`: 一个结构体数组,用于定义如何从Lua返回的表中弹出数据并写回到C结构体。 函数执行步骤: 1. 根据`fname`获取Lua函数,并将其压入栈顶(通过`tpApp_lua_get_table_function`)。 2. 使用`tpApp_lua_push_table`函数,根据`push_op`和`cfg`,构建一个Lua表(作为参数)压入栈顶。 3. 调用`tpApp_lua_call_luci`函数,该函数会调用之前获取的Lua函数(使用刚刚压入的表作为参数),并获取其返回值(应该是一个表)。 4. 使用`tpApp_lua_pop_table`函数,根据`pop_op`和`cfg`,将Lua返回的表中的数据弹出并写回`cfg`指向的结构体。 现在,重点解释`tpApp_lua_push_table`函数和`TPAPP_LUA_TBL_OP`结构体: 结构体`TPAPP_LUA_TBL_OP`定义: - `const char *key`: 在Lua表中,这个字段对应的键名。 - `size_t offset`: 该字段在C结构体中的偏移量(用于定位数据在`cfg`中的位置)。 - `TPAPP_LUA_CB cb`: 一个回调函数,用于自定义如何将C数据转换为Lua数据(或反之)。如果为NULL,则使用默认的转换方式。 - `unsigned long arg`: 一个额外的参数,可以传递给回调函数,用于特殊处理。 假设`tpApp_lua_push_table`函数的工作方式: 它遍历`push_op`数组(直到遇到一个全为0或特定终止条件的元素),对于每个元素: 1. 根据`offset`从`cfg`指向的结构体中取出数据(起始地址为`(char*)cfg + offset`)。 2. 如果提供了回调函数`cb`,则使用回调函数将数据压入Lua栈;否则,根据数据类型使用默认方式(例如,如果是整数,用`lua_pushinteger`等)。 3. 将值设置到表中(使用`key`作为键)。 类似地,`tpApp_lua_pop_table`函数会从栈顶取一个表,然后遍历`pop_op`数组,从表中读取每个键对应的值,并使用回调(或默认方式)写回到`cfg`的对应位置。 示例: 假设有一个C结构体: typedef struct { int id; char name[32]; } Config; 我们想构建一个Lua表:{id=1001, name="test"},那么`push_op`数组可以定义为: TPAPP_LUA_TBL_OP push_ops[] = { {"id", offsetof(Config, id), NULL, 0}, {"name", offsetof(Config, name), NULL, 0}, {NULL, 0, NULL, 0} // 结束标记 }; 在调用`tpApp_lua_push_table`时,它会创建一个新表,并设置两个字段:整数`id`和字符串`name`。 注意:`push_op`和`pop_op`数组通常以空元素(例如所有字段为0)结束。 这个函数整体上是一个封装,用于方便地调用Lua函数并传递结构化的参数,同时处理返回的结构化数据。 </think> ### 函数 `tpApp_lua_do_luci` 解析 #### 函数功能 这是一个**Lua与C交互的桥接函数**,用于: 1. 从Lua中获取指定函数(`fname`) 2. 将C结构体数据(`cfg`)通过`push_op`规则转换成Lua表作为参数 3. 调用Lua函数 4. 将Lua返回的表数据通过`pop_op`规则写回C结构体 #### 参数详解 | 参数 | 类型 | 作用 | |------------|---------------------------|----------------------------------------------------------------------| | `L` | `lua_State*` | Lua虚拟机状态指针,所有Lua操作的入口 | | `fname` | `const char*` | 要调用的Lua函数名(如`"my_function"`) | | `cfg` | `void*` | 指向C结构体的指针,存储输入/输出数据 | | `push_op` | `TPAPP_LUA_TBL_OP*` | **输入转换规则**:定义如何将C数据转为Lua表字段 | | `pop_op` | `TPAPP_LUA_TBL_OP*` | **输出转换规则**:定义如何从Lua表读取数据写回C结构体 | --- ### `TPAPP_LUA_TBL_OP` 结构体解析 ```c typedef struct _TPAPP_LUA_TBL_OP { const char *key; // Lua表中的字段名(如"username") size_t offset; // 该字段在C结构体中的内存偏移量(字节) TPAPP_LUA_CB cb; // 自定义类型转换的回调函数(可为NULL) unsigned long arg; // 传递给回调函数的额外参数 } TPAPP_LUA_TBL_OP; ``` #### 工作流程示例 假设有以下C结构体: ```c typedef struct { int user_id; char name[32]; double balance; } UserConfig; ``` 对应的转换规则定义: ```c // 输入转换规则(C -> Lua) TPAPP_LUA_TBL_OP push_rules[] = { {"id", offsetof(UserConfig, user_id), NULL, 0}, // 直接复制int {"name", offsetof(UserConfig, name), NULL, 0}, // 直接复制字符串 {"money", offsetof(UserConfig, balance), double_to_lua, 2}, // 自定义转换 {NULL, 0, NULL, 0} // 结束标记 }; // 输出转换规则(Lua -> C) TPAPP_LUA_TBL_OP pop_rules[] = { {"new_id", offsetof(UserConfig, user_id), lua_to_int, 0}, {NULL, 0, NULL, 0} }; ``` #### 执行过程 当调用 `tpApp_lua_do_luci(L, "update_user", &user_cfg, push_rules, pop_rules)`: 1. **压入参数** - 根据`push_rules`创建Lua表: `{ id = 1001, name = "Alice", money = 150.75 }` 2. **调用Lua函数** - 执行 `update_user({...})` 3. **处理返回值** - 假设Lua返回:`{ new_id = 1002 }` - 根据`pop_rules`将`new_id`的值写入`user_cfg.user_id` --- ### 关键组件说明 1. **offsetof** 计算结构体字段的内存偏移(如`user_id`在`UserConfig`中的位置) 2. **回调函数(TPAPP_LUA_CB)** ```c typedef int (*TPAPP_LUA_CB)(lua_State *L, void *data, unsigned long arg); ``` - 当基础类型不匹配时,自定义C/Lua数据转换 - 示例:将C的`double`转为Lua的货币字符串 3. **arg参数** 向回调函数传递额外信息(如精度位数、编码格式等)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值