• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > lua.dllLua中共享upvalue是个怎么样的用法?

lua.dllLua中共享upvalue是个怎么样的用法?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了lua.dllLua中共享upvalue是个怎么样的用法?等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:lua.dll Lua中共享upvalue是个怎么样的用法?
描述:

今天看云风的enjoy2D源码,发现有个Lua的upvalue用法不太明白,简单的测试代码如下


test.cpp

#include<iostream>
extern "C"
{
#include"lua.h"
#include"lauxlib.h"
#include"lualib.h"
}
using namespace std;

static int
ltest(lua_State *L)
{

    lua_getfield(L, lua_upvalueindex(1), "a");
    cout << lua_tointeger(L, -1) << endl;
    return 1;
}

static int
luaTest(lua_State *L)
{
    luaL_Reg l[] =
    {
        {"test",ltest},
        {NULL,NULL},
    };
    luaL_newlibtable(L, l);
    lua_pushvalue(L, -1);
    luaL_setfuncs(L, l, 1);
    return 1;
}

int main()
{
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    luaL_requiref(L, "LuaTest", luaTest, 0);
    luaL_dofile(L, "a.lua");
    return 0;
}

a.lua

local c=require"LuaTest"
c.a=50
c.test()

为什么对LuaTest这个模块设置一个表作为上值之后,直接用“a”索引上值的表就能取出50呢?
翻了一下《Programming in Lua, 3rd Edition》,里面确实也是有这个用法,但是没有讲太详细,求解答。


解决方案1:


//创建一个库table
luaL_newlibtable(L, l);
//压入一个upvalue 也就是这个表自身
lua_pushvalue(L, -1);//这句你可以注释掉测试一下,并且luaL_setfuncs最后一个参数设为0。

//为这个表注册函数   ,并且设置1个upvalue
luaL_setfuncs(L, l, 1);


//这个函数就有了这个libtable的环境(也就是upvalue)
static int ltest(lua_State *L);


//lua_upvalueindex是一个宏。  你可以打开看一下  ,他会返回一个当前环境的伪索引,指向这个函数的环境 (upvalue),  参数填的是1,也就说明一个clua函数是可以设多个环境的,填1就是读第一个环境

--载入c库
local c=require"LuaTest"
--给这个table创建一个整数a成员  
c.a=50
--调用clua函数,  
--这个c函数在注册的时候就给他绑定了这个table的环境,
--并且将c函数赋值给table的test成员
c.test()

不知道这样讲能行吗,好多没用lua了,忘差不多了。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-06-05 ft232串口通信数据错误
  • 2017-06-05 怎么自己制造一台微型计算机
  • 2017-06-05 用串口调试助手往wince平板上发送数字,结果自动换行是怎么回事?
  • 2017-06-05 如何将matlab算法程序生成的C文件嵌入到ARM嵌入式程序中?
  • 2017-06-05 usbmassstorage中如何获得硬盘容量
  • 2017-06-05 智能公交读卡----帮忙选购嵌入式开发板Atmega162+rc522
  • 2017-06-05 linux虚拟机连不上外网,该如何正确地设置呢?
  • 2017-06-05 bootm61000000启动内核时,显示了startingkernel,不过突然显示一个disablingoutercache是什么意思
  • 2017-06-05 VS2008开windowsCE程序如何通过webservice连接oracle
  • 2017-06-05 驱动程序如何发送自己的IP包。?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Warning:StackpointerissetuptoincorrectalignmentStackaddr=0xAAAAAAAA
    • 请问如何通过COM或USB口进行脉冲计数
    • μC/OS-II简介
    • 请问:驱动程序调试
    • 想问一下上位机软件是否可能在写串口的时候引发ERROR_GEN_FAILURE错误?
    • 完全没接触过驱动,求startup教程。
    • DDKgenprintdll安装
    • uboot如何设置参数,引导进入recovery
    • 电量计DS2784参数设置
    • 内存地址区间大小计算题

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有