lua学习(三)

lua 判断变量是否是数字 ,但在某些情况下(例如处理字符串形式的数字)需要更加灵活的判断方式,比如使用。如果你需要判断一个值是否可以转换为数字(例如字符串形式的数字),那么。如果你只需要判断一个值是否是数字类型(即 Lua 中的。函数尝试将其参数转换为数字,如果转换失败,它将返回。基于这一点,可以编写一个函数来判断一个值是否是数字。可以用于判断一个值是否是数字(即返回。函数可以用于检查变量的类型。函数来判断一个值是否是数字。在 Lua 中,可以使用。是一个数字,函数返回。类型),可以直接使用。 阅读详情

对lua有了个初步的了解, 同事按捺不住在项目上面用了一下c api. 由于大家都不熟lua的 c api, 我也去学习一下. 这样大家可以讨论了.
5.1的 luaopen_io()不能用了, 用了一下直接挂掉. 查了一下官方的文档, 他没有说清楚.只是说不能直接调用. 不明白 
而且看了一下, lua_open()宏最好由 luaL_newstate()来代替.

首先试了一下对 全局变量的读取.
width = 100;
height = 200;

执行操作
1. 新建一个lua状态
2. open要用到的库, 可以看到栈上就多了几个表. 我open了base, string和math之后,栈上会压进四个表.猜猜有可能有一个math表, math表里面有sin,pi之类的函数或者变量.
3. 载入test.lua文件,用lua_pcall执行它.这时候width和height的值就全部确定了. 下一步是通过c来得到它们
4. lua_getglobal根据"width"名称取得width的值, 这个方法会把width的值也就是100压入栈中 :)
5. 用lua_isnumber判断得到的是否数字,如果是数字那用lua_tonumber来取得值


这个简单! 接下来是取表
BLUE = {r=100, g=0, b=1}
执行操作:
1. 新建一个lua状态
2. open要用到的库, 可以看到栈上就多了几个表. 我open了base, string和math之后,栈上会压进四个表.猜猜有可能有一个math表, math表里面有sin,pi之类的函数或者变量.
3. 载入test.lua文件,用lua_pcall执行它.
4. lua_getglobal根据"BLUE "名称取得BLUE 的值,同时把BLUE 的值,也就是一个BLUE的表压入栈中.
5. lua_pushstring把'r'压入栈中,此时栈顶元素为'r', 下面为BLUE表. 也就是'r '的index为-1,Blue表的index为-2
6. 所以用lua_gettable(L, -2);根据index值-2取得这个表, 再由栈顶的key值'r',取得BLUE表的r元素的值代替栈顶的值.这时候栈顶为100,下面就是BLUE表.
7.接下来就是取值了, 在栈顶取值,和以前的一样 :)  要注意的是, 栈顶的值要pop清掉 :)


再试试多层的表 :
DBServer =
{
    {
        Name    = "__odbc0",
        DSN     = "oracleDB",
        Login   = "onlinegame",
        Passwd  = "aol123"
    }
}

这个预料应该是push一个number取得子表,试验之后果然和猜想一样!

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

void error (lua_State *L, const char *fmt, ...)
{
 va_list argp;
 va_start(argp, fmt);
 vfprintf(stderr, fmt, argp);
 va_end(argp);
 lua_close(L);
 exit(EXIT_FAILURE);
}


int main (void)
{
 //int width;
 //int height;

 lua_State *L = lua_open();

 luaopen_base(L);
 luaopen_string(L);
 luaopen_math(L);

 if (luaL_loadfile(L, "test.lua") || lua_pcall(L, 0, 0, 0))
  error(L, "cannot run configuration file: %s", lua_tostring(L, -1));

 
 lua_getglobal(L, "DBServer");
 if (!lua_istable(L, -1))
  error(L, "'DBServer' is not a valid table");

 lua_pushnumber(L, 1);
 lua_gettable(L, -2);
 if (!lua_istable(L, -1))
  error(L, "this is not a valid  table");

 lua_pushstring(L, "Name");
 lua_gettable(L, -2);

 if (!lua_isstring(L, -1))
  error(L, "invalid string");


 printf("结果是: /t `%s' /n", lua_tostring(L, -1));
 
 lua_pop(L, 1);


 lua_close(L);


}


Lua学习总结 1.Lua中的模块 Lua学习到这里的时候我们产生一个疑问,Lua的代码是怎么写的呢?全都写在一个文件中吗?显然不可能。那样的话耦合度也太高了吧? Lua中为我们提供了模块的功能,类似于C#中的命名空间,我们在Lua代码中引入模块,就可以调用模块中的公有变量或函数了,相当于提供了API接口。 实际上,模块的本质是一个table,只是table中放的是变量和函数,那么我们定义模块的方法就很简单... 阅读详情

相关推荐

SAP-ABAP:SAP数据库视图(Database View)详解-创建

数据库视图是SAP中实现多表关联查询的基础工具,适合简单的跨表查询和权限控制场景。但其功能有限,对于复杂逻辑或高性能需求,建议结合CDS视图或ABAP程序开发。通过合理设计,数据库视图可显著提升开发效率和系统可维护性。它存储在数据库中,但本身不存储数据,仅通过查询动态生成结果。是一种基于物理数据库表的虚拟表,通过关联多个表(使用。

baidu_35680696的博客 1352

Lua5.3——C API函数

这里按字母次序列出了所有C API中的函数和类型。每个函数都有一个这样的提示:[-o, +p, x] 对于第一个域,o,指的是该函数会从栈上弹出多少个元素。第二个域,p,指该函数会将多少个元素压栈。(所有函数都会在弹出参数后再把结果压栈。) x|y 这种形式的域表示该函数根据具体情况可能压入(或弹出) x 或 y 个元素;问号 '?' 表示 我们无法仅通过参数来了解该函数会弹出/压入多少元素 (

u014086857的专栏 1万+

20、七鳃鳗繁殖与早期生活史:从水质到养殖的全面解析

本文全面解析了七鳃鳗的繁殖与早期生活史,重点探讨了水质对幼体生存的影响、养殖密度与生长关系、变态过程的时间与大小特征,以及人工繁殖在濒危物种恢复和入侵物种控制中的应用。同时,文章分析了大规模养殖面临的挖掘基质需求、空间限制、清洁管理、疾病防控及微生物环境等挑战,并强调实验室养殖对科学研究和种群管理的重要意义。随着技术进步,未来有望扩展更多物种的繁殖研究,揭示七鳃鳗生物学的进化奥秘,实现资源的可持续利用。

l6m7n8的博客 96

lua 学习笔记 & 四

lua中,字符串的第一个字符的索引是1,也可以使用负数索引,这样将从字符串的尾部开始计数,索引-1代表字符串最后一个字符。 %a+ (alphabet)字母 +表示匹配一个或者多个 %c      控制字符 %d      数字 %l       小写字母 %p     标点字符 %s     空白字符 %u     大写字母 %w    字母和数字字符 %x    十

u010792888的专栏 995

Lua 常用函数

本文转载于:https://blog.csdn.net/xuzhonghai/article/details/7239195 lua_getallocf lua_Alloc lua_getallocf (lua_State *L, void **ud); 返回给定状态机的内存分配器函数。如果ud不是NULL,Lua 把调用lua_newstate时传入的那个指针放入*ud。 lua_getfenv void lua_getfenv (lua_State *L, int ind...

focus on security 1609

luaCAPI基础部分

luaL_newState()//创建Lua状态 lua_pushnumber(L, value) lua_pushstring(L, value) lua_isnumber(L, index) lua_isstring(L, index)  成功返回1,否则返回0 lua_tonumber(L, index)  //获取栈上的值 lua_tostring(L, ind

饭团 653

LuaLua学习笔记(

LuaLua学习笔记(

FEZ98 597

lua学习

确保某些数据是符合预期的,避免影响最终结果。:assert(条件语句,报错信息)当条件语句为true时,assert语句不会有任何行为,但是当为false时,assert会将报错信息弹出,并中断程序的执行。:由于断言只在调试模式下有效,因此在生产环境中通常会被禁用,以避免影响程序性能‌。

weixin_40453090的博客 948

学习Lua 基本语法

Lua 学习起来非常简单,我们可以创建第一个 Lua 程序!

m0_72864708的博客 145

lua学习

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34184158的博客 99

Lua学习

function norm (x,y) --n = x^2 + y^2 local n = x^2 + y^2 return n end --[[ print(norm(1,2)) print(n) --]] 观察局部与q

MyObject-C的专栏 401

、一起学习Lua 基本语法

Lua学习起来非常简单,我们可以创建第一个Lua程序!

m0_66404702的博客 123

Lua学习笔记之从Lua中调用C

继续学习Lua与C交互,下面是在学习Lua中调用C定义函数的笔记以及自己的理解,其中学习过程中的写的测试代码可以从我的GitHub下载。      0、对于能被Lua调用的C函数,必须注册这个C函数,以便用某种适当的方式将函数地址告诉Lua。当Lua调用C函数时,使用了与C调用Lua函数时相同的栈。C函数从栈中获取函数参数,并将结果压入栈中。为了在栈中将函数结果与其他值区分,C函数还

MaximusZhou的专栏 2615

Lua 常用函数 一

lua_getallocf lua_Alloc lua_getallocf (lua_State *L, void **ud); 返回给定状态机的内存分配器函数。如果 ud 不是 NULL ,Lua 把调用lua_newstate 时传入的那个指针放入*ud 。 lua_getfenv void lua_getfenv (lua_State *L, int index); 把索引处值...

wangminshe89 1097

c lua语言教程,Lua教程(十九):C调用Lua

1. 基础:Lua的一项重要用途就是作为一种配置语言。现在从一个简单的示例开始吧。--这里是用Lua代码定义的窗口大小的配置信息width = 200height = 300下面是读取配置信息的C/C++代码:#include #include #include #include #include void load(lua_State* L, const char* fname, int* w,...

weixin_28725037的博客 900

<11>Lua 常用函数 一

lua_getallocf lua_Alloc lua_getallocf (lua_State *L, void **ud); 返回给定状态机的内存分配器函数。如果 ud 不是 NULL ,Lua 把调用lua_newstate 时传入的那个指针放入*ud 。 lua_getfenv void lua_getfenv (lua_State *L, int index); 把索引处值的环境表压入堆...

jadeshu的博客 8416

Lua 判断此字符串是否为纯数字

--判断此字符串是否为纯数字 function UICommon.isNumber(words) if string.len(words) < 1 then return false end for i=1,string.len(words) do if string.byte(string.sub(words,i,i)) < 48 or string.byte(string.sub(words,i,i)) > 57 then return fal.

来一杯82年的拉菲 2681

C++调用lua 运行方式、案例亲测 及 常用API

文章目录运行方式常用API压入元素类型相关查询相关执行lua代码获取 Lua 代码执行结果其他常用API案例亲测 我也琢磨了好一会儿,这篇文章改了又改,主要是每一part的顺序问题。 运行方式 先看张图: 它的执行方式,有点熟悉,但是一时又实在想不起来那个案例。 波兰式,对,思考一下波兰式。 在Lua和C语言之间进行数据交换时,由于两种语言之间有着较大的差异,比如Lua是动态类型,C语言是静态类型,Lua是自动内存管理,而C语言则是手动内存管理。为了解决这些问题,Lua的设计者使用了虚拟栈作为二者之间数据

看,未来的博客 1353

Hi3519DV500R001C01SPC011海思3519dv500 SDK开发包

Hi3519DV500R001C01SPC011海思3519dv500 SDK开发包

上一篇: lua学习(二)
下一篇: lua学习(四)
flashvan
博客等级 码龄22年 6粉丝 67原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值