lua调用C语言函数,在函数中进行类型检查

  1. 使用lua_is*函数族进行检查(除了lua_type之外的另一种方式)

    • Lua C API提供了一系列lua_is*函数,如lua_isnumberlua_isstringlua_isboolean等,用于检查栈上元素的类型。
    • 示例代码如下,假设我们有一个C函数,它期望接收一个布尔值和一个数字作为参数:
    #include <stdio.h>
    #include <lua.h>
    #include <lauxlib.h>
    #include <lualib.h>static int check_and_print(lua_State *L) {// 检查第一个参数是否为布尔值if (!lua_isboolean(L, 1)) {lua_pushstring(L, "第一个参数必须是布尔值");lua_error(L);}// 检查第二个参数是否为数字if (!lua_isnumber(L, 2)) {lua_pushstring(L, "第二个参数必须是数字");lua_error(L);}int booleanValue = lua_toboolean(L, 1);double numberValue = lua_tonumber(L, 2);printf("布尔值为: %d, 数字为: %f\n", booleanValue, numberValue);// 可以根据需要返回值给Lua,这里简单返回数字lua_pushnumber(L, numberValue);return 1;
    }
    
    • 在这里,lua_isboolean函数检查第一个参数是否是布尔类型,lua_isnumber函数检查第二个参数是否是数字类型。如果检查不通过,就会抛出错误。
  2. 联合类型检查和转换(处理多种可能的数字类型)

    • 在Lua中,数字类型可能是整数或者浮点数。当在C函数中接收数字类型参数时,可以使用联合(union)来处理不同的数字类型情况。
    • 示例代码如下,这个C函数可以接收整数或者浮点数作为第一个参数,并将其转换为浮点数进行处理:
    #include <stdio.h>
    #include <lua.h>
    #include <lauxlib.h>
    #include <lualib.h>
    #include <math.h>static int process_number(lua_State *L) {// 检查第一个参数是否是数字类型if (!lua_isnumber(L, 1)) {lua_pushstring(L, "第一个参数必须是数字");lua_error(L);}// 使用union来处理可能的整数或浮点数情况union {int i;double d;} number;if (lua_isinteger(L, 1)) {number.i = lua_tointeger(L, 1);} else {number.d = lua_tonumber(L, 1);}// 对转换后的浮点数进行简单的数学操作(这里是求平方根)double result = sqrt(number.d);lua_pushnumber(L, result);return 1;
    }
    
    • 在这个示例中,首先使用lua_isnumber检查参数是否是数字类型。然后,通过一个联合来处理整数和浮点数的转换。如果参数是整数,就使用lua_tointeger将其转换为整数存储在联合中;如果是浮点数,就使用lua_tonumber将其转换为浮点数存储在联合中。最后,对转换后的浮点数进行求平方根操作,并将结果返回给Lua。
  3. 检查表类型及表内元素类型(处理复杂数据结构)

    • 当Lua传递表(table)类型的参数给C函数时,需要检查表的类型以及表内元素的类型。
    • 以下示例是一个C函数,它期望接收一个表,表中有两个元素,第一个元素是字符串,第二个元素是数字,然后打印这两个元素并返回它们的拼接结果(字符串和数字转换为字符串后拼接):
    #include <stdio.h>
    #include <lua.h>
    #include <lauxlib.h>
    #include <lualib.h>static int process_table(lua_State *L) {// 检查第一个参数是否是表类型if (!lua_istable(L, 1)) {lua_pushstring(L, "第一个参数必须是表");lua_error(L);}// 获取表中的两个元素lua_pushinteger(L, 1);lua_gettable(L, 1);if (!lua_isstring(L, - 1)) {lua_pushstring(L, "表中的第一个元素必须是字符串");lua_error(L);}const char *str = lua_tostring(L, - 1);lua_pop(L, 1);lua_pushinteger(L, 2);lua_gettable(L, 1);if (!lua_isnumber(L, - 1)) {lua_pushstring(L, "表中的第二个元素必须是数字");lua_error(L);}double num = lua_tonumber(L, - 1);lua_pop(L, 1);printf("字符串是: %s, 数字是: %f\n", str, num);char buffer[100];sprintf(buffer, "%s%f", str, num);lua_pushstring(L, buffer);return 1;
    }
    
    • 在这个示例中:
      • 首先使用lua_istable检查第一个参数是否是表类型。
      • 然后通过lua_pushintegerlua_gettable组合来获取表中的元素。对于每个元素,使用相应的lua_is*函数检查类型。如果类型不符合要求,就抛出错误。
      • 最后,获取正确类型的元素后,进行打印操作,并将拼接后的结果返回给Lua。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/474974.html

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

相关文章

Oracle RAC仲裁交换机的小科普

一、Oracle RAC仲裁交换机的主要功能 Oracle RAC仲裁交换机是用于Oracle Real Application Clusters&#xff08;真实应用集群&#xff0c;简称RAC&#xff09;环境中的一种网络设备。它主要用于在集群节点之间进行通信&#xff0c;以确保集群的高可用性和故障切换能力。以下是…

Leetcode 快乐数

算法思想&#xff1a; 这段代码的目的是判断一个正整数是否是 快乐数&#xff08;Happy Number&#xff09;。根据题目要求&#xff0c;快乐数定义如下&#xff1a; 对于一个正整数&#xff0c;不断将它每个位上的数字替换为这些数字平方和。重复这个过程&#xff0c;如果最终…

使用 Vue 和 Create-Vue 构建工程化前端项目

目录 前言1. 工程化的意义与 Vue 的生态支持2. 搭建 Vue 工程化项目2.1 环境准备2.2 使用 create-vue 创建项目2.2.1 初始化项目2.2.2 安装依赖2.2.3 本地运行 3. Vue 项目的目录结构解析4. Vue 开发流程详解4.1 项目入口与根组件4.1.1 main.js 的作用4.1.2 App.vue 的结构 4.2…

【MySQL实战45讲笔记】基础篇——redo log 和 binlog

系列文章 基础篇——MySQL 的基础架构 目录 系列文章1. 重要的日志模块&#xff1a;redo log 和 binlog1.1 redo log1.2 binlog1.3 执行器和 InnoDB 引擎内部如何执行更新语句 1. 重要的日志模块&#xff1a;redo log 和 binlog 前面系统的了解了一个查询语句的执行流程&…

C++ lambda(匿名函数)捕获自己

今天写算法题时无意间遇到一种情况,我的深度优先遍历函数要在函数内调用自身,如果是普通函数没什么问题,但如果是 匿名函数 的话会有一些问题,甚至问ai,ai也没打上来,上网搜了半天,才找到这个的解答,故作此文 以费契那波数列为例 // 普通函数式 int fun(int pos) {if (pos …

DAO模式

前言 DAO&#xff08;Data Access Object&#xff09;模式 是一种常用的设计模式&#xff0c;主要用于将数据访问逻辑与业务逻辑分离。它提供了一种抽象层&#xff0c;使得应用程序可以与不同的数据源&#xff08;如数据库、文件系统等&#xff09;进行交互&#xff0c;而无需…

mysql日志写满出现The table ‘xxxx_amazon_order’ is full

数仓发现写数据出现 SQL 错误 [1114] [HY000]: The table ‘xxxx_amazon_order’ is full 1.第一时间查看系统磁盘, 发现空间写满了 df -h因为mysql是使用docker部署的, Docker 的默认存储位置在 /var/lib/docker /var 目录默认是在根分区 (/dev/mapper/centos-root) 下的 …

【读书笔记-《网络是怎样连接的》- 7】Chapter3_2 路由器

本篇继续介绍路由器及其转发过程。 1 路由器内部结构 路由器内部结构图如图所示。 即主要包含左侧的包转发模块和右侧的端口模块。转发模块负责查找包的发送目的地&#xff0c;端口模块完成包的发送。通过安装不同的硬件&#xff0c;转发模块不仅可以支持以太网&#xff0c;也…

P5099 [USACO04OPEN] Cave Cows 4

P5099 [USACO04OPEN] Cave Cows 4https://www.luogu.com.cn/problem/P5099 思路&#xff1a; 这里的垫蹄石之间很明显是有后效性的 所以不能用dp来做 考虑宽搜 我们每次都枚举和这个垫蹄石之间x方向和z方向的距离均不超过2的垫脚石 因为都很大 我们可以使用 代码&#xf…

高阶C语言之六:程序环境和预处理

本文介绍程序的环境&#xff0c;在Linux下对编译链接理解&#xff0c;较为简短&#xff0c;着重在于编译的步骤。 C的环境 在ANSI C&#xff08;标准C语言&#xff09;的任何一种实现中&#xff0c;存在两个不同的环境。 翻译环境&#xff1a;在这个环境中&#xff0c;源代码…

【Python数据可视化分析实战】数据爬取—京东手机品牌信息数据爬取和数据分析与可视化

大数据分析设计方案 1.数据集来源&#xff1a;https://search.jd.com 2.实现思路&#xff1a; &#xff08;1&#xff09;数据爬取 首先&#xff0c;我们需要从京东平台上采集手机品牌的相关数据。可以通过网络爬虫或API接口等方式获取数据。为了保证数据的完整性和准确性&…

【MySQL-4】表的基本查询

目录 1. 整体学习的思维导图 2. 表的创建 2.1 Create(创建) 2.1.1 插入规则 2.1.2 更新插入 2.2 Retrieve(读取) 2.2.1 创建一个实例表 2.3 select使用 2.3.1 全表查询 2.3.2 指定序列查询 2.3.3 查询表达式 2.3.3.1 为查询表达式改名字 2.3.4 查询去重 2.…

无人机航测技术算法概述!

一、核心技术 传感器技术&#xff1a; GPS/GLONASS&#xff1a;无人机通过卫星定位系统实现高精度的飞行控制和数据采集。 高清相机&#xff1a;用于拍摄地面图像&#xff0c;通过后续图像处理生成三维模型。 激光雷达&#xff08;LiDAR&#xff09;&#xff1a;通过激光扫…

uniapp 自定义加载组件,全屏加载,局部加载 (微信小程序)

效果图 全屏加载 页面加载使用 局部加载 列表加载里面使用 使用gif html <template><view><view class"" v-if"typeFullScreen"><view class"loading" v-if"show"><view class""><i…

【D3.js in Action 3 精译_040】4.4 D3 弧形图的绘制方法

当前内容所在位置&#xff1a; 第四章 直线、曲线与弧线的绘制 ✔️ 4.1 坐标轴的创建&#xff08;上篇&#xff09; 4.1.1 D3 中的边距约定&#xff08;中篇&#xff09;4.1.2 坐标轴的生成&#xff08;中篇&#xff09; 4.1.2.1 比例尺的声明&#xff08;中篇&#xff09;4.1…

element ui 走马灯一页展示多个数据实现

element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 主要是对走马灯的数据的操作&#xff0c;先看js处理 let list [{ i: 1, name: 1 },{ i: 2, name: 2 },{ i: 3, name: 3 },{ i: 4, name: 4 },]let newL…

使用MaxKB搭建知识库问答系统并接入个人网站(halo)

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;使用MaxKB搭建知识库问答系统并接入个人网站 前言 从OpenAI推出ChatGPT到现在&#xff0c;大模型已经渗透到各行各业&#xff0c;大模型也逐渐趋于平民化&#xff1b;从最开始对其理解、生成、强大的知识积累的惊叹&…

Linux进阶:软件安装、网络操作、端口、进程等

软件安装 yum 和 apt 均需要root权限 CentOS系统使用&#xff1a; yum [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&#xff0c;自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&…

如何解决飞书网页文字无法复制的问题

如何解决网页文字无法复制的问题&#xff1f;特别推荐提词宝防复制文案功能&#xff01; 在日常工作和学习中&#xff0c;我们经常遇到一些网页文字无法复制的情况&#xff0c;无论是因为权限限制还是其他原因&#xff0c;手动输入内容不仅耗时费力&#xff0c;还容易出错。那…

STM32电源管理—实现低功耗

注&#xff1a; 本文是学习野火的指南针开发板过程的学习笔记&#xff0c;可能有误&#xff0c;详细请看B站野火官方配套视频教程&#xff08;这个教程真的讲的很详细&#xff0c;请给官方三连吧&#xff09; 在响应绿色发展的同时&#xff0c;在很多应用场合中都对电子设备的功…