第9月第12天 lua_push lua_to luaL_check stack quick
1.
c代码中通过lua_push 把数据压入堆栈,lua调用c函数得到数据。luaL_check是对lua_to的封装,从堆栈中获取lua代码中函数调用的数据。
static int
lread(lua_State *L) {
struct socket * s = lua_touserdata(L,);
if (s == NULL || s->listen_fd < ) {
return luaL_error(L, "start socket first");
}
size_t sz = ;
const char * welcome = luaL_checklstring(L,,&sz);
int fd = test(s, welcome,sz);
if (fd >= ) {
char buffer[BUFFER_SIZE];
int rd = recv(fd, buffer, BUFFER_SIZE, );
if (rd <= ) {
s->closed = ;
lua_pushboolean(L, );
return ;
}
lua_pushlstring(L, buffer, rd);
return ;
}
return ;
}
static int
lstart(lua_State *L) {
const char * addr = luaL_checkstring(L,);
int port = luaL_checkinteger(L,); struct socket * s = lua_newuserdata(L, sizeof(*s));
s->listen_fd = -;
s->fd = -;
s->closed = ; int lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int reuse = ;
setsockopt(s->listen_fd, SOL_SOCKET, SO_REUSEADDR, (void *)&reuse, sizeof(int)); struct sockaddr_in service; service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr(addr);
service.sin_port = htons(port); if (bind(lfd, (const struct sockaddr *)&service, sizeof(service)) < ) {
closesocket(lfd);
printf("bind() failed");
exit();
}
if (listen(lfd, ) < ) {
printf("listen(): Error");
exit();
}
s->listen_fd = lfd; return ;
}
function ldebug.start(host)
local ip = (host and host.ip) or "127.0.0.1"
local port = (host and host.port) or
socks_fd = csock.start(ip , port)
end function readline()
local ret = split()
if ret then
return ret
end
local data = csock.read(socks_fd, socks_prompt)
if data then
socks_buffer = socks_buffer .. data
return split()
end return data
end
2.stack
lua_pushnumber( L, 211 );
lua_pushnumber( L, 2222 );
lua_newtable( L );
执行代码,跟踪L的top,发现top的地址是增加的。
(StkId) top = 0x00007f9c63d01730
(StkId) top = 0x00007f9c63d01740
(StkId) top = 0x00007f9c63d01750
(StkId) top = 0x00007f9c63d01760
所以
那么当执行完lua_newtable之后栈上有三个元素,大致就是这样:
table
222
211
现在211是第一个元素,index为1,不过LUA也可以用负数来表示,那么现在他是多少?
index -index value
3 -1 table
2 -2 222
1 -3 211
http://blog.csdn.net/djvc/article/details/62135945
http://www.cnblogs.com/ringofthec/archive/2010/11/05/luaClosure.html
http://www.cnblogs.com/dwjaissk/p/3477062.html
http://www.benmutou.com/archives/52
3.quick
http://cocos2d-lua.org/download/3-6-4.md
https://github.com/u0u0/Quick-Cocos2dx-Community
https://github.com/shenzhan168/BubbleGame
old:
https://github.com/ever-changing/quickcocos2dx
17 ls /Users/temp/Downloads/quick-cocos2d-x
18 export
19 export QUICK_COCOS2DX_ROOT=/Users/temp/Downloads/quick-cocos2d-x
20 echo $(QUICK_COCOS2DX_ROOT)
21 $(QUICK_COCOS2DX_ROOT)
22 echo $(QUICK_COCOS2DX_ROOT)
23 cd /Users/temp/Downloads/quick-cocos2d-x/bin
24 ./create_project.sh -o landscape com.Reventon.Game.testGame
25 ./create_project.sh
26 ./create_project.sh -h
27 ./create_project.sh -r landscape com.Reventon.Game.testGame
28 ./create_project.sh -r landscape -p com.Reventon.Game.testGame
29 ls
30 testgame/run-mac.sh
31 testgame/run-mac.sh
32 testgame/run-mac.sh
33 testgame/run-mac.sh
ui.newTTFLabelMenuItem
https://github.com/search?utf8=%E2%9C%93&q=newTTFLabelMenuItem&type=Code
lua调用c/c++时,c/c++语言的函数参数一般只有char *,float,int等基础类型,没有字典类型。
lua代码的函数参数可以是table,function,所以一般会封装一个函数调用c/c++,这样lua代码调用lua函数传递table,lua函数内部调用c/c++。
function ldebug.start(host)
local ip = (host and host.ip) or "127.0.0.1"
local port = (host and host.port) or
socks_fd = csock.start(ip , port)
end ldebug.start { ip = "127.0.0.1", port = }
static int
lstart(lua_State *L) {
const char * addr = luaL_checkstring(L,);
int port = luaL_checkinteger(L,); struct socket * s = lua_newuserdata(L, sizeof(*s));
s->listen_fd = -;
s->fd = -;
s->closed = ; int lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int reuse = ;
setsockopt(s->listen_fd, SOL_SOCKET, SO_REUSEADDR, (void *)&reuse, sizeof(int)); struct sockaddr_in service; service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr(addr);
service.sin_port = htons(port); if (bind(lfd, (const struct sockaddr *)&service, sizeof(service)) < ) {
closesocket(lfd);
printf("bind() failed");
exit();
}
if (listen(lfd, ) < ) {
printf("listen(): Error");
exit();
}
s->listen_fd = lfd; return ;
}
--[[-- 使用 TTF 字体创建文字显示对象,并返回 CCLabelTTF 对象。 可用参数: - text: 要显示的文本
- font: 字体名,如果是非系统自带的 TTF 字体,那么指定为字体文件名
- size: 文字尺寸,因为是 TTF 字体,所以可以任意指定尺寸
- color: 文字颜色(可选),用 ccc3() 指定,默认为白色
- align: 文字的水平对齐方式(可选)
- valign: 文字的垂直对齐方式(可选),仅在指定了 dimensions 参数时有效
- dimensions: 文字显示对象的尺寸(可选),使用 CCSize() 指定
- x, y: 坐标(可选) align 和 valign 参数可用的值: - ui.TEXT_ALIGN_LEFT 左对齐
- ui.TEXT_ALIGN_CENTER 水平居中对齐
- ui.TEXT_ALIGN_RIGHT 右对齐
- ui.TEXT_VALIGN_TOP 垂直顶部对齐
- ui.TEXT_VALIGN_CENTER 垂直居中对齐
- ui.TEXT_VALIGN_BOTTOM 垂直底部对齐 ~~~ lua -- 创建一个居中对齐的文字显示对象
local label = ui.newTTFLabel({
text = "Hello, World",
font = "Marker Felt",
size = 64,
align = ui.TEXT_ALIGN_CENTER -- 文字内部居中对齐
}) -- 左对齐,并且多行文字顶部对齐
local label = ui.newTTFLabel({
text = "Hello, World\n您好,世界",
font = "Arial",
size = 64,
color = ccc3(255, 0, 0), -- 使用纯红色
align = ui.TEXT_ALIGN_LEFT,
valign = ui.TEXT_VALIGN_TOP,
dimensions = CCSize(400, 200)
}) ~~~ @param table params 参数表格对象 @return CCLabelTTF CCLabelTTF对象 ]]
function ui.newTTFLabel(params)
assert(type(params) == "table",
"[framework.ui] newTTFLabel() invalid params") local text = tostring(params.text)
local font = params.font or ui.DEFAULT_TTF_FONT
local size = params.size or ui.DEFAULT_TTF_FONT_SIZE
local color = params.color or display.COLOR_WHITE
local textAlign = params.align or ui.TEXT_ALIGN_LEFT
local textValign = params.valign or ui.TEXT_VALIGN_CENTER
local x, y = params.x, params.y
local dimensions = params.dimensions assert(type(size) == "number",
"[framework.ui] newTTFLabel() invalid params.size") local label
if dimensions then
label = CCLabelTTF:create(text, font, size, dimensions, textAlign, textValign)
else
label = CCLabelTTF:create(text, font, size)
end if label then
label:setColor(color) function label:realign(x, y)
if textAlign == ui.TEXT_ALIGN_LEFT then
label:setPosition(math.round(x + label:getContentSize().width / ), y)
elseif textAlign == ui.TEXT_ALIGN_RIGHT then
label:setPosition(x - math.round(label:getContentSize().width / ), y)
else
label:setPosition(x, y)
end
end if x and y then label:realign(x, y) end
end return label
end
第9月第12天 lua_push lua_to luaL_check stack quick的更多相关文章
- C# 获取从1月至12月的月初时间和月末时间
public IActionResult GetMonthData() { var dataList = new List<object>(); var currentMonth = Da ...
- 第27月第12天 webrtc ios openssl boost
1. source 'https://github.com/CocoaPods/Specs.git' target 'YOUR_APPLICATION_TARGET_NAME_HERE' do pla ...
- 第16月第12天 CABasicAnimation 旋转加速
1. ; double duration = 10.0f; ; i<count; i++) { //旋转动画 CABasicAnimation *anima3 = [CABasicAnimati ...
- 第13月第12天 Constraints priority
1.Constraints priority 将evInputView的高度约束的priority设为750,evInputView的inputTextView如果不设高度约束,那么高度就是defau ...
- 第8月第12天 python json.dumps danmu
1.json.dumps return JsonResponse({ 'status': WechatMessage.POST_METHOD_REQUIRED[1], 'status_code': W ...
- 第7月第12天 opengles background
1. After your app exits its applicationDidEnterBackground: method, it must not make any new OpenGL E ...
- AV-TEST杀毒软件能力测试(2018年1月-12月)杀毒软件排名
2018年1月到12月,AV-TEST攻击了实验室中无数的Windows系统,在830多项单独测试中测试了7种杀毒软件和5种快捷工具. 1.测试概述 在长期测试中,实验室在各种实际场景中测试了杀毒软件 ...
- js获取上一个月、下一个月格式为yyyy-mm-dd的日期
/** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...
- 用sql查询当天,一周,一个月的数据
用sql查询当天,一周,一个月的数据 数据查询,不管在网站还是在系统,都很常见,下文是介绍最常见的以日期查询的语句 select * from ShopOrder where datediff(w ...
随机推荐
- PAT-1010 Radix
1010 Radix (25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 1 ...
- CVE-2010-2883
测试环境: Windows xp sp3 Adobe Reader 9.3.4 成因: CoolType.dll库的strcat函数在解析SING表中的uniqueName域时未作长度检查而造成栈溢出 ...
- PAT甲题题解-1112. Stucked Keyboard (20)-(map应用)
题意:给定一个k,键盘里有些键盘卡住了,按一次会打出k次,要求找出可能的坏键,按发现的顺序输出,并且输出正确的字符串顺序. map<char,int>用来标记一个键是否为坏键,一开始的时候 ...
- PAT甲题题解-1115. Counting Nodes in a BST (30)-(构建二分搜索树+dfs)
题意:给出一个序列,构建二叉搜索树(BST),输出二叉搜索树最后两层的节点个数n1和n2,以及他们的和sum: n1 + n2 = sum 递归建树,然后再dfs求出最大层数,接着再dfs计算出最后两 ...
- Alpha版阶段项目总结
一,设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 针对铁道大学大学生,增加他们的社交范围.我们的软件定义很清楚.对典型用户和典型场景有清晰的描述 ...
- 软工第三次作业 -- 结对之AutoCS1.0
031302331 031302223 一.将初始排课表导入系统数据库 法1:通过jxl解析excel,把数据插入数据库.较简单,预计用时60分钟 我们采取的是 法2(预计用时30分钟):我们使用的是 ...
- Daily Scrum - 12/03
Meeting Minutes 后端基本完成,结束当前Sprint, 开始下一个Sprint.进一步讨论了UI,并完成了任务分配. Burndown Progress part 组 ...
- Oracle DROPtable以及Truncate table 的简单测试
1. 一个用户库 有一个业务表比较大 大小是 49g 表的行数为:121546147 一亿两千万行 制作一个虚拟机的快照测试一下 drop table 和 truncate table的性能差距 2. ...
- Jira 7.2.4简单安装过程
1. 下载安装jira的安装文件 这里使用同事已经下载好的文件. 2. 下载破解文件. 也是同事下载好的 具体文件为 atlassian-jira-software--x64 51CTO下载-jira ...
- 【转帖】Git学习笔记 记录一下
本文内容参考了廖雪峰老师的博文,并做了适当整理,方便大家查阅. 原帖地址 https://wangfanggang.com/Git/git/ 常用命令 仓库初始化 - git init 1 git i ...