阅读lmathlib.c
2016-02-17 19:30
357 查看
1. 重要的结构 luaL_Reg
typedef struct luaL_Reg { const char *name; lua_CFunction func; } luaL_Reg;
typedef int (*lua_CFunction) (lua_State *L);可以用该结构做参数简单的来创建table
luaL_newlib(L, mathlib);这样在栈顶创建了一个table,并且table各个域(主要是各种方法 c closure, 注意是没有upvalue)math lib里面还添加了几个常量,赋值
lua_pushnumber(L, PI);lua_setfield(L, -2, "pi");lua_pushnumber(L, (lua_Number)HUGE_VAL);lua_setfield(L, -2, "huge");lua_pushinteger(L, LUA_MAXINTEGER);lua_setfield(L, -2, "maxinteger");lua_pushinteger(L, LUA_MININTEGER);lua_setfield(L, -2, "mininteger");放一个值到栈顶,然后设置给刚刚创建的这个table。2. RANDOM 能够处理0-2个参数lua_gettop()检测参数数量luaL_checkinteger(L, 1); 这个函数用来检查栈上的参数是否是int值,并返回; 这个顺序是从上到下(我的理解)lua_pushinteger(L, (lua_Integer)r + low); 将结果放回栈里return 1; 表示返回一个值,注意一定要将栈对齐。
static int math_random (lua_State *L) {lua_Integer low, up;double r = (double)l_rand() * (1.0 / ((double)L_RANDMAX + 1.0));switch (lua_gettop(L)) { /* check number of arguments */case 0: { /* no arguments */lua_pushnumber(L, (lua_Number)r); /* Number between 0 and 1 */return 1;}case 1: { /* only upper limit */low = 1;up = luaL_checkinteger(L, 1);break;}case 2: { /* lower and upper limits */low = luaL_checkinteger(L, 1);up = luaL_checkinteger(L, 2);break;}default: return luaL_error(L, "wrong number of arguments");}/* random integer in the interval [low, up] */luaL_argcheck(L, low <= up, 1, "interval is empty");luaL_argcheck(L, low >= 0 || up <= LUA_MAXINTEGER + low, 1,"interval too large");r *= (double)(up - low) + 1.0;lua_pushinteger(L, (lua_Integer)r + low);return 1;}
相关文章推荐
- qemu-img 快照的一些总结
- 【原】本地win7,远程服务器XP系统,两台机器间不能拖动文件
- 关于启动过程及log
- robotium步骤和模板
- Qt实现类似sendmessage和postmessage发送自定义消息
- 蚁视头盔上手简评
- hibernate4之一对多自身映射(四)
- iOS环信3.0集成 (一)SDK的集成
- Divisor Summation_
- matlab坐标轴axes对象句柄消失的解决办法
- 进程和线程的区别与联系是什么?
- POJ 3279反转问题,dp
- iOS中UITextView的字数限制
- 为什么会出现数据安全问题?资源抢夺有哪些解决办法
- 查询oracle表的信息(表,字段,约束,索引)
- 必须掌握的八种排序(5-6)--冒泡排序,快速排序
- 对UIView、UIWindow和CALayer的理解
- 九度[1120]全排列
- PHP的异常处理机制
- Unity全景项目经验Q&A