图片来源:https://www.pixiv.net/artworks/100578118 C 取模 C语言的取模运算符(%)仅支持整数,定义如下: 对于 a/b , C语言会自动截断计算结果的小数部分, C99规定了”趋零截断”,举个例子 2.14 会截断为 2 , -2.14 会截断为 -2 。 简单来讲,C语言取模结果的符号(正数还是负数)与 a 的符号相同 Lua 取模 Lua取模操作有两种 % 和 math.fmod() ,稍微有一点区别: “//” 在lua中称为floor除法(floor division),会将运算结果向负无穷取整(rounds the quotient towards minus infinity),举个例子 2.14 会截断为 2.0 , -2.14 会截断为 -3.0。需要注意的两点: 参考:
lua
图片来源:https://www.pixiv.net/artworks/82570722 Lua官方解释器完全使用ANSI C编写,并且提供了C API,使用C/C++和Lua交互相当方便 Lua虚拟栈 C和Lua的交互基于一个栈,这个栈的每个位置都有两个索引值,这里只需要记住这个栈的栈顶索引始终为“-1”,栈底索引始终为“1”即可 基本环境加载 后续的代码示例均基于“test.lua”“main.c”这两个文件 Lua C API的函数大多第一个参数都为“lua_State *L”,即“main.c”中使用“luaL_newstate()”创建的lua住线程,后续不再说明 参考编译命令 C获取Lua变量 Lua的C API提供 “lua_getglobal” 来将指定全局变量压入栈,然后提供一系列“lua_toxxx”函数来将栈中的变量转换为C类型变量,相关函数在使用前 获取布尔值、数值、字符串 布尔值 由于C语言里没有对应布尔类型,会将布尔类型值转换为整形的“1”和“0”。使用“lua_typename”函数可以将表示lua类型的整数转换为对应C字符串 数值 lua脚本中不显式区分整数和浮点数,所以“lua_getglobal”返回的类型都是“LUA_TNUMBER” ,但转换为C变量时需要区分,分别使用“lua_tointeger”和“lua_tonumber” 字符串 获取字符串差不多,“lua_tostring”会在末尾补 '\0' 但如果字符串本身内容也包含 '\0' 的话无法判断真实长度,此时可以使用“lua_tolstring”传递第三个参数保存字符串长度 分别使用“printf”和“fwrite”打印获取到的字符串 要在命令行确认是否有’\0’输出可以将输出通过管道传递给‘cat -v’命令,’\0’会以“^@”的形式显示 获取表中的变量 通过变量名获取 获取表中的变量,需要先将表压入栈,然后把这个表在栈中的位置和要获取的变量名传给“lua_getfield”,“lua_getfield”会将变量压入栈 通过key获取 有时候表中成员没有变量名,比如数组和字典,此时可以先将表压入栈,然后通过“lua_pushxxx”系列函数(或者其他方式)将key压入栈,之后调用“lua_gettable”将table[key]压入栈 遍历数组 操作数组前需要先将数组,压入栈,获取数组长度使用“luaL_len”,该函数会直接返回数组长度。访问数组中的单个值使用“lua_geti”传入数组在栈中的索引和要访问的数组下标 C调用Lua函数 在C中调用Lua函数需要先将函数压入栈,然后依次将函数参数入栈,调用“lua_pcall”设置函数参数数量、返回值数量、错误信息位置即可,函数返回值会依次压入栈中 调用全局函数 调用对象的成员函数 其实和调用全局函数没太大区别,就是需要先获取对象再获取对象的函数,另外成员函数定义时使用“:”语法省略了self参数,但C调用的时候不能省略