当前位置: 首页 > article >正文

C函数从lua中读取数据接口常用接口

  1. 读取基本数据类型的接口
    • lua_tonumberlua_tointeger
      • 用途:用于从Lua栈中获取数字类型的数据。lua_tonumber用于获取浮点数,lua_tointeger用于获取整数。
      • 示例:假设在Lua中调用一个C函数并传入一个数字,在C函数中可以这样获取这个数字。
      static int get_number(lua_State *L) {
          double num = lua_tonumber(L, 1);  // 获取栈顶(第一个参数)的数字(浮点数)
          int integer_num = lua_tointeger(L, 1);  // 尝试获取栈顶的整数
          // 可以进行后续操作,比如打印或其他计算
          printf("浮点数: %f, 整数: %d\n", num, integer_num);
          return 0;
      }
      
    • lua_tostring
      • 用途:用于从Lua栈中获取字符串类型的数据。
      • 示例:当Lua传入一个字符串给C函数时,可以使用这个接口获取。
      static int get_string(lua_State *L) {
          const char *str = lua_tostring(L, 1);  // 获取栈顶(第一个参数)的字符串
          printf("字符串: %s\n", str);
          return 0;
      }
      
    • lua_toboolean
      • 用途:用于从Lua栈中获取布尔类型的数据。
      • 示例:如果Lua传入一个布尔值给C函数,可以如下获取。
      static int get_boolean(lua_State *L) {
          int boolean_value = lua_toboolean(L, 1);  // 获取栈顶(第一个参数)的布尔值
          printf("布尔值: %d\n", boolean_value);
          return 0;
      }
      
  2. 读取表(Table)类型数据的接口
    • lua_istablelua_gettablelua_push*系列函数组合
      • 用途:lua_istable用于检查栈顶元素是否是表。lua_gettable用于获取表中的元素,通常需要先将键(可以是数字或字符串)压入栈,然后调用lua_gettable来获取对应的值。lua_push*系列函数用于将键压入栈。
      • 示例:假设在Lua中有一个表{name = "John", age = 30},在C函数中获取表中的元素。
      static int get_table_data(lua_State *L) {
          if (lua_istable(L, 1)) {  // 检查第一个参数是否是表
              lua_pushstring(L, "name");  // 将键"name"压入栈
              lua_gettable(L, 1);  // 获取表中键为"name"的值
              const char *name = lua_tostring(L, -1);  // 获取栈顶的值,即"name"对应的字符串
              lua_pop(L, 1);  // 弹出栈顶元素
      
              lua_pushinteger(L, 2);  // 将键2(这里假设表中的第二个元素的键是2)压入栈
              lua_gettable(L, 1);  // 获取表中键为2的值
              int age = lua_tointeger(L, -1);  // 获取栈顶的值,即年龄对应的整数
              lua_pop(L, 1);  // 弹出栈顶元素
      
              printf("姓名: %s, 年龄: %d\n", name, age);
          } else {
              lua_pushstring(L, "第一个参数必须是表");
              lua_error(L);
          }
          return 0;
      }
      
  3. 读取函数类型数据的接口
    • lua_tocfunction
      • 用途:用于从Lua栈中获取C函数(C closure)。
      • 示例:如果Lua传入一个C函数(这个C函数可能是之前通过lua_pushcfunction等方式注册到Lua中的)给另一个C函数,可以这样获取。
      static int call_lua_passed_cfunction(lua_State *L) {
          lua_CFunction cfunc = lua_tocfunction(L, 1);  // 获取栈顶(第一个参数)的C函数
          // 可以调用这个C函数,假设它不需要参数并且返回一个数字
          lua_pushnumber(L, cfunc(L));
          return 1;  // 返回一个结果
      }
      
  4. 读取用户数据(UserData)类型的接口
    • lua_touserdata
      • 用途:用于从Lua栈中获取用户数据。用户数据是一种可以在Lua和C之间传递自定义数据结构的机制。
      • 示例:假设在C中定义了一个结构体,并且将这个结构体的实例作为用户数据传递给Lua,在C函数中可以这样获取。
      typedef struct {
          int value;
      } MyUserData;
      
      static int get_userdata(lua_State *L) {
          MyUserData *user_data = (MyUserData *)lua_touserdata(L, 1);  // 获取栈顶(第一个参数)的用户数据
          printf("用户数据中的值: %d\n", user_data->value);
          return 0;
      }
      

http://www.kler.cn/a/401809.html

相关文章:

  • MySQL数据库3——函数与约束
  • 【leetcode 02】27. 移除元素
  • if 语句 和 case 语句
  • 算法 二分法查找的利弊
  • 鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)
  • 一文了解Android的核心系统服务
  • kali搭建pikachu靶场
  • 论文翻译 | Learning to Transfer Prompts for Text Generation
  • 统信操作系统离线安装JDK、Nginx、elasticsearch、kibana、ik、pinyin
  • k8s篇之流量转发走向
  • 阿里云ACK容器如何配置pod分散在集群的不同节点上
  • Vue 3与TypeScript集成指南:构建类型安全的前端应用
  • 高阶C语言之五:(数据)文件
  • 【Java】ArrayList与LinkedList详解!!!
  • 一种由于吸入硅酸盐粉尘而引起的肺部疾病:pneumonoultramicroscopicsilicovolcanoconiosis
  • 【java-ffmpeg】java 内存测试和集成
  • 第二十五章 TCP 客户端 服务器通信 - TCP 设备的 READ 命令
  • 打开AI的黑盒子——机器学习可解释性!
  • 网络安全进阶
  • 【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
  • 在MacOS中Finder中通过路径来导航
  • RabbitMQ高可用
  • 《Python浪漫的烟花表白特效》
  • 【动手做】安装Miniconda和jupyter notebook环境实现线性回归
  • Conda 安装纯净版ComfyUI
  • 使用EventLog Analyzer日志分析工具监测 Windows Server 安全威胁