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.mzph.cn/bicheng/61339.shtml

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

相关文章

51c自动驾驶~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/12086789 #跨越微小陷阱,行动更加稳健 目前四足机器人的全球市场上,市场份额最大的是哪个国家的企业?A.美国 B.中国 C.其他 波士顿动力四足机器人 云深处 绝影X30 四足机器人 &#x1f…

优化装配,提升品质:虚拟装配在汽车制造中的关键作用

汽车是各种零部件的有机结合体,因此汽车的装配工艺水平和装配质量直接影响着汽车的质量与性能。在汽车装配过程中,经常会发生零部件间干涉或装配顺序不合理等现象,且许多零部件制造阶段产生的质量隐患要等到实际装配阶段才能显现出来&#xf…

Java 设计模式 详解

在Java开发中,设计模式是一种常见的、成熟的解决方案,用于应对特定的设计问题和复杂性管理。以下是一些常用的设计模式,它们可以分为三类:创建型模式、结构型模式和行为型模式。 一、创建型模式 创建型模式主要负责对象的创建&a…

java基础知识全集(一篇看到爽)(持续更新中)

java规范(企业级) 见名知意, 命名合理 强调了命名的可读性和合理性。 驼峰命名法 大驼峰:首字母大写,之后每个单词的首字母也大写(如:MyVariableName)。小驼峰:首字母小写&#xff0…

css iframe标签使用

<iframe> 标签用于在网页中嵌入另一个 HTML 页面。它非常灵活&#xff0c;可用于嵌入内容&#xff0c;比如其他网站、视频、地图等。以下是有关 <iframe> 的详细介绍及使用方法&#xff1a; 基本语法 <iframe src"URL" width"宽度" height…

进入 RPG Prime:第六周游戏指南

进入 RPG Prime&#xff0c;在这里&#xff0c;每一个任务都是一个等待展开的史诗故事。选择你的等级&#xff0c;召集你的队伍&#xff0c;开始融合策略、魔法和神话的冒险&#xff01; 本系列共有 10 篇攻略&#xff0c;贯穿 Alpha 第 4 季&#xff0c;每周都有新攻略&#…

leetcode 数组专题 06-扫描线算法(Sweep Line Algorithm)

扫描线专题 leetcode 数组专题 06-扫描线算法&#xff08;Sweep Line Algorithm&#xff09; leetcode 数组专题 06-leetcode.218 the-skyline-problem 力扣.218 天际线问题 leetcode 数组专题 06-leetcode.252 meeting room 力扣.252 会议室 leetcode 数组专题 06-leetcod…

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56 1. STM32F407 BootLoader 中的 Flash 擦除功能详解 在嵌入式系统中&#xff0c;BootLoader 的设计是非常关键的部分&#xff0c;它负责引导主程序的启动、升级以及安全管理。而在 STM32F407 等 MCU 上实现 BootLoader&…

网页抓取API,让数据获取更简单

网页抓取的过程通常分为以下步骤&#xff0c;尤其是在面对静态网页时&#xff1a; 获取页面 HTML&#xff1a;使用 HTTP 客户端下载目标页面的 HTML 内容。解析 HTML&#xff1a;将下载的 HTML 输入解析器&#xff0c;准备提取内容。提取数据&#xff1a;利用解析器功能&#…

Golang语言整合jwt+gin框架实现token

1.下载jwt go get -u github.com/dgrijalva/jwt-go2.新建生成token和解析token文件 2.1 新建common文件夹和jwtConfig文件夹 新建jwtconfig.go文件 2.2 jwtconfig.go文件代码 /* Time : 2021/8/2 下午3:03 Author : mrxuexi File : main Software: GoLand */ package jwtC…

Spring Security SecurityContextHolder组件

在本篇博客中&#xff0c;我们将讨论 Spring Security 的 SecurityContextHolder 组件&#xff0c;包括其实现方式、关键特性&#xff0c;并通过实际示例进行说明。 理解 SecurityContextHolder SecurityContextHolder 是 Spring Security 存储当前安全上下文详细信息的地方。…

详细分析ipvsadm负载均衡的命令

目录 前言1. 基本知识2. 命令参数3. 拓展 前言 LVS四层负载均衡架构详解Lvs推荐阅读&#xff1a;添加链接描述 1. 基本知识 ipvsadm 是用于管理和配置 Linux 服务器上 IP Virtual Server (IPVS) 的工具&#xff0c;是 Linux 提供的一个负载均衡模块&#xff0c;支持多种负载…

量化选股日常操作日记-11-ai眼镜-润欣科技

用 微信小程序 梦想兔企业智能风险分析助手 &#xff0c;选择AI眼镜板块&#xff0c;挖掘了几个合适的股&#xff0c;分析下来感觉 润欣科技 比较安全些适合观察&#xff0c;几块到十几块波动&#xff0c;企业基本面也没有特别大问题。就是现在价位在周期波动高位&#xff0c;下…

云安全之法律和合规

0x00 前言 本文主要内容是从法律&#xff0c;合同&#xff0c;电子举证&#xff0c;以及合规和审计这五个部分来记录一下相关的云安全内容 0x01 法律 受法律约束的影响因素 云服务所在的地区云用户所在的区域数据主体所在的区域 GDPR&#xff1a;通用数据保护法案&#xf…

动力学法测量金属弹性模量

&#x1f3eb;中南民族大学-⚛大学物理实验2-&#x1f4e0;通信工程2024 目录 Python代码 1. 绘制图像 2. 弹性模量数值计算 图像显示 Pycharm 豆包 MarsCode 非常强大&#xff01;有了它们&#xff0c;我在处理大学物理实验的数据及其可视化就非常方便&#xff0c;极大缩减…

鸿蒙的数据存储API存储和读

数据处理: 使用鸿蒙的数据存储API存储和读 随着智能设备的日益普及&#xff0c;高效、安全地管理设备上的数据成为开发者的首要任务。鸿蒙操作系统&#xff08;HarmonyOS&#xff09;作为一款面向未来的全场景分布式操作系统&#xff0c;提供了丰富的API支持&#xff0c;其中数…

NLP论文速读(EMNLP 2024)|动态奖励与提示优化来帮助语言模型的进行自我对齐

论文速读|Dynamic Rewarding with Prompt Optimization Enables Tuning-free Self-Alignment of Language Models 论文信息&#xff1a; 简介: 本文讨论的背景是大型语言模型&#xff08;LLMs&#xff09;的自我对齐问题。传统的LLMs对齐方法依赖于昂贵的训练和人类偏好注释&am…

计算机中的网络安全

在本篇中介绍了以下几个方面: 机密性 密码学 对称加密算法(DES, 3DES, AES) 公开秘钥算法 RSA大素数的获取 完整性 散列函数(MD5, SHA-1, 并没有提及算法实现) 报文鉴别(MAC) 数字签名 端点鉴别 应用 SSL(TCP网络安全) 运行时安全 防火墙的基本知识 主要体现在以下几个方…

SLM561A系列60V10-50mA单通道线性恒流LED驱动芯片,为汽车照明、景观照明助力

SLM561A系列选型参考&#xff1a; SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 S…

golang操作mysql基础驱动github.com/go-sql-driver/mysql使用

golang中类似java操作mysql的jdbc一样&#xff0c;github.com/go-sql-driver/mysql也为go提供了基础接口&#xff0c;在开发中往往需要写更多的代码来满足自己的定制需求&#xff0c;java在驱动基础上有了扩展&#xff0c;orm框架诞生&#xff0c;mybatis、jpa等都是好用的扩展…