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

news/2024/11/20 21:59:04/
  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.ppmy.cn/news/1548586.html

相关文章

LabVIEW三针自动校准系统

基于LabVIEW的智能三针自动校准系统采用非接触式激光测径仪对标准三针进行精确测量。系统通过LabVIEW软件平台与硬件设备的协同工作&#xff0c;实现了数据自动采集、处理及报告生成&#xff0c;大幅提高了校准精度与效率&#xff0c;并有效降低了人为操作误差。 一、项目背景…

ITSS服务经理: 山西科技学院智能铸造现代产业学院揭牌

记者从山西科技学院传来喜讯&#xff0c;近日&#xff0c;在该院工程训练中心与智能铸造现代产业学院于山西省晋城市泽州县绿色智能铸造创新产业园隆重举行的揭牌启动仪式上&#xff0c;标志着学院迈入崭新篇章。应用型本科高校&#xff0c;作为孕育高素质应用人才的摇篮&#…

25. 架构能力

文章目录 第25章 架构能力25.1 个人能力&#xff1a;架构师的职责、技能和知识职责技能知识那经验方面呢&#xff1f; 25.2 软件架构组织的能力25.3 成为更优秀的架构师接受指导指导他人 25.4 小结25.5 扩展阅读25.6 问题讨论 第25章 架构能力 人生苦短&#xff0c;学海无涯。 …

在Linux环境下部署TiDB可以通过几种不同的方法

在Linux环境下部署TiDB可以通过几种不同的方法&#xff0c;包括使用TiDB官方提供的二进制包、Docker容器、Kubernetes等。最常见的方法是使用TiDB官方的二进制包&#xff0c;下面将详细介绍如何在Linux系统上手动部署TiDB。 前提条件 操作系统&#xff1a;Linux&#xff08;例…

<项目代码>YOLOv8 草莓成熟识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

解读InnoDB数据库索引页与数据行的紧密关联

目录 一、快速走进索引页结构 &#xff08;一&#xff09;整体展示说明 &#xff08;二&#xff09;内容说明 File Header&#xff08;文件头部&#xff09; Page Header&#xff08;页面头部&#xff09; Infimum Supremum&#xff08;最小记录和最大记录&#xff09; …

Python去除图像白色背景

使用Pillow去除图像背景 安装依赖&#xff1a; pip install pillow 实现步骤&#xff1a; 使用Pillow库加载图像&#xff0c;并将其转换为RGBA模式&#xff0c;以支持透明度。遍历图像的每个像素&#xff0c;检查其红色、绿色和蓝色值是否都高于预设的阈值。对于被视为白色…

一天速转golang!

首先你需要会一门后端语言&#xff0c;以及要有基本的网络编程能力和并发思想 环境 本人在linux环境下下载的go1.23.3版本&#xff0c;使用Vimgo作为IDE 具体做法此处不再赘述&#xff0c;自行查阅其他博客 第一个Golang程序 package main ——定义声明包名(可以类比java来…