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

news/2024/11/20 16:24:33/
  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.ppmy.cn/news/1548521.html

相关文章

多目标优化算法:多目标黑翅鸢算法(MOBKA)求解UF1-UF10,提供完整MATLAB代码

一、黑翅鸢算法介绍 黑翅鸢优化算法(Black-winged Kite Algorithm, BKA)是2024年提出的一种元启发式优化算法,其灵感来源于黑翅鸢的迁徙和捕食行为。这种算法通过模拟黑翅鸢在捕食过程中的飞行和搜索策略,被用来解决优化问题&…

【Java】ArrayList与LinkedList详解!!!

目录 一🌞、List 1🍅.什么是List? 2🍅.List中的常用方法 二🌞、ArrayList 1🍍.什么是ArrayList? 2🍍.ArrayList的实例化 3🍍.ArrayList的使用 4🍍.ArrayList的遍…

Gin路由深入

路由(Routing )是由一个 URI (或者叫路径)和一个特定的 HTTP 方法( GET 、 POST 等) 组成的,涉及到应用如何响应客户端对某个网站节点的访问。 1、GET POST

ssm117网络教学平台的设计与实现+vue(论文+源码)_kaic

毕业论文(设计) 题 目: 网络教学平台的设计与实现的设计与实现 院(系): 专业年级: 姓 名: 学 号: 指导教师: 2021年…

基于EEMD变换的ECG心电信号去噪和心率估计matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1EMD 基本原理 4.2 R波检测 4.3 心率检测 5.完整工程文件 1.课题概述 基于EEMD变换的ECG心电信号去噪和心率估计matlab仿真,并分析不同大小噪声干扰下,ECG信号心率的估计结果…

Amazon Linux 搭建Zookeeper+Kafka集群

Zookeeper集群搭建 Kafka集群是把状态保存在Zookeeper中的,首先要搭建Zookeeper集群。 Zookeeper 集群模式一共有三种类型的角色 Leader: 处理所有的事务请求(写请求),可以处理读请求,集群中只能有一个Leader。 Follo…

数据结构(二)线性表

线性表,也称为线性结构,是数据结构中的一种基本类型,其特点是数据元素之间存在一对一的线性关系。线性表通常可以用数组(顺序存储)或链表(链式存储)来实现。线性表的特点是数据元素的排列呈现线…

Python 使用Django进行单元测试unittest

文章目录 为什么选择 Django 的单元测试框架Python Django单元测试持续集成和自动化测试 为什么选择 Django 的单元测试框架 Django 提供了一个强大的测试框架,内置了丰富的测试工具和功能,使得编写和运行单元测试变得非常简单。 下面是一些选择 Djang…