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

news2024/11/17 21:22:38
  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.coloradmin.cn/o/2242405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《操作系统 - 清华大学》3 -3:连续内存分配:内存碎片与分区的动态分配

文章目录 0. 概述1. 内存碎片问题2. 动态分配3. 首次适配算法4. 最优适配算法5. 最差适配算法 0. 概述 内存分配是操作系统管理过程中很重要的环节,首先需要考虑的是一块连续区域分配的过程,这个过程中会有很多问题,首先比较关注的一个问题是…

vue内置指令和自定义指令

常见的指令: v-bind : 单向绑定解析表达式, 可简写为 :xxx v-model : 双向数据绑定 v-for : 遍历数组/对象/字符串 v-on : 绑定事件监听, 可简…

蓝桥杯备赛(持续更新)

16届蓝桥杯算法类知识图谱.pdf 1. 格式打印 %03d:如果是两位数,将会在前面添上一位0 %.2f:会保留两位小数 如果是long,必须在数字后面加上L。 2. 进制转化 2.1. 十进制转任意进制: 十进制转任意进制时&#xff…

vue 项目使用 nginx 部署

前言 记录下使用element-admin-template 改造项目踩过的坑及打包部署过程 一、根据权限增加动态路由不生效 原因是Sidebar中路由取的 this.$router.options.routes,需要在计算路由 permission.js 增加如下代码 // generate accessible routes map based on roles const acce…

TensorFlow 2.0 环境配置

官方文档:CUDA Installation Guide for Windows 官方文档有坑,windows的安装指南直接复制了linux的指南内容:忽略这些离谱的信息即可。 可以从官方文档知悉,cuda依赖特定版本的C编译器。但是我懒得为了一个编译器就下载整个visua…

【计算机网络】【传输层】【习题】

计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理,请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注:本文基于《计算机网络》(第5版)吴功宜、吴英…

HarmonyOS本地存储-Preferences(用户首选项)的使用

一,用户首选项简述 ohos.data.preferences (用户首选项) 用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。 数据存储形式为键值对,键的类型为字符串型,值的存储数据…

基于Java Web 的家乡特色菜推荐系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

【售前方案】工业园区整体解决方案,智慧园区方案,智慧城市方案,智慧各类信息化方案(ppt原件)

基于云计算、物联网、移动通信计算的智慧园区集中运营管理平台是一个高度集成化、智能化的管理系统,它利用先进的技术手段对园区进行全方位的监控和管理。 软件资料清单列表部分文档清单:工作安排任务书,可行性分析报告,立项申请审…

Vue2+ElementUI:用计算属性实现搜索框功能

前言: 本文代码使用vue2element UI。 输入框搜索的功能,可以在前端通过计算属性过滤实现,也可以调用后端写好的接口。本文介绍的是通过计算属性对表格数据实时过滤,后附完整代码,代码中提供的是死数据,可…

CSS实现炫酷的水波纹效果

炫酷的水波纹效果 看好了&#xff0c;下面是我最后的波纹了 实现代码 HTML&#xff1a; <div class"container"></div> <script src"https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>CSS: body{height: 1…

【会话文本nlp】对话文本解析库pyconverse使用教程版本报错、模型下载等问题解决超参数调试

前言&#xff1a; 此篇博客用于记录调用pyconverse库解析对话文本时遇到的问题与解决思路&#xff0c;以供大家参考。 文章目录 pycoverse介绍代码github链接问题解决1 [cannot import name ‘cached_download‘ from ‘huggingface_hub‘ 问题解决](https://blog.csdn.net/wei…

单元测试时报错找不到@SpringBootConfiguration

找到问题出现原因&#xff1a; 错误表示 Spring Boot 在运行测试时无法找到 SpringBootConfiguration 注解。 通常&#xff0c;SpringBootTest注解用于加载 Spring Boot 应用上下文&#xff0c;但它需要找到一个带有SpringBootConfiguration&#xff08;或者Configuration&am…

【数据结构】11.哈夫曼树哈夫曼编码

一、哈夫曼树的基本概念 哈夫曼&#xff08;Huffman&#xff09;树又称最优树&#xff0c;是一类带权路径长度最短的树&#xff0c;在实际中有广泛的用途。 路径&#xff1a; 从树中一个节点到另一个节点之间的分支构成这两个节点之间的路径。路径长度&#xff1a; 路径上的分…

AntD表单自定义组件

前言 表单可以说是前端最常见的一种组件&#xff0c;特别是在进行搜索的时候使用的最频繁&#xff0c;自定义表单组件&#xff0c;丰富了搜索框的类型&#xff0c;使数据展现的更灵活 内容讲解 1、官方介绍 AntD-Formhttps://ant.design/components/form-cn#form-demo-cust…

day-83 最少翻转次数使二进制矩阵回文 II

思路 关键在于1的个数要为4的倍数&#xff0c;首先镜像的四个位置肯定一定为4的倍数&#xff0c;如果行和列为奇数则需要单独考虑&#xff0c;如果行和列皆为奇数&#xff0c;那么中心的那个数一定为0 解题过程 再单独考虑如果行和列为奇数&#xff0c;具体参考灵神。如果diff…

Gitcode文件历史记录查看和还原

文件历史记录 文件历史记录用于记录代码文件的更改历史&#xff0c;它允许用户查看文件的不同版本&#xff0c;了解每个版本的修改内容、作者和提交消息。这对于跟踪文件演进、恢复错误更改、审查代码以及了解项目进展都非常有用。 文件历史记录功能提供了以下核心功能&#…

WebSocket协议在Java中的整合

1. 常见的消息推送方式 2.WebSocket API 3.基于WebSocket的实战&#xff08;实时聊天室&#xff09; 这里以解析后端代码为主&#xff0c;前端不作为重点&#xff0c;若想复现项目&#xff0c;请从作者的仓库中拉取代码 WebSocket-chatRoom: 基于WebSocket协议实现一个简单的…

http自动发送请求工具(自动化测试http请求)

点击下载《http自动发送请求工具(自动化测试http请求)》 前言 在现代软件开发过程中&#xff0c;HTTP 请求的自动化测试是确保应用程序稳定性和可靠性的关键环节。为了满足这一需求&#xff0c;我开发了一款功能强大且易于使用的自动化 HTTP 请求发送工具。该工具基于 C# 开发…

【小白可懂】微信小程序---课表渲染

结果展示&#xff1a;&#xff08;代码在最后&#xff09; WeChat_20241116174431 项目简介 在数字化校园建设的大背景下&#xff0c;为了更好地服务于在校师生&#xff0c;我们开发了一款基于微信小程序的课表管理系统。该系统采用了现代化的前端技术和优雅的设计风格&#x…