zoukankan      html  css  js  c++  java
  • Lua学习笔记

    1、Lua开发工具(lua for windows)详解及其环境配置

    Lua开发工具(lua for window)及其环境配置是本文要介绍的内容,主要是来了解并学习lua开发工具的使用和环境的配置.

    lua for window 下载地址:http://luaforwindows.luaforge.net/

    它包括:
    Lua Interpreter(Lua解释器)
    Lua Reference Manual(Lua参考手册)
    Quick Lua Tour (Lua快速入门)
    Examples (Lua范例)
    Libraries with documentation (一些Lua库和文档)
    SciTE (一个很棒的多用途编辑器,已经对Lua做了特殊设置)

    下载后直接安装就可以使用了。

    2、验证安装Lua开发环境

    打开SciTE,新建一个文件,输入一行lua代码:

    print("hello,lua")

    然后保存为hello.lua,注意保存文件时要加文件名后缀.lua,否则可能不能正确的运行。

    按F5,如果SciTE的输出窗口出现

    >lua -e "io.stdout:setvbuf 'no'" "hello.lua"
    hello,lua >Exit code: 0

    字样则代表整个lua开发环境安装成功。

    2、eclipse

    下载地址:http://www.eclipse.org/ldt/

    中的http://www.eclipse.org/downloads/download.php?file=/ldt/products/stable/1.3.1/org.eclipse.ldt.product-win32.win32.x86_64.zip&mirror_id=1

    3、visual studio中使用Lua

    如果你是个C/C++程序员,用的是VS。本人用的是VS2008。

    选择“Tools(工具)”-->“Options(选项)”-->“Projects and Solutions(项目和解决方案)”-->“VC++ Directories(C++目录)”。

    (1)在右边的“Show Directories for(显示目录)”中的下拉菜单中选择“Include Files(包含文件)”,然后在下面添加一个新路径"C:Program Fileslua5.1include"。

    (2)在右边的“Show Directories for(显示目录)”中的下拉菜单中选择“Library Files(包含文件)”,然后在下面添加一个新路径"C:Program Fileslua5.1lib“。

    注意:C:Program Fileslua是lua for windows 的安装路径

    OK,VS的配置结束。

    4、来试试我们第一个LUA应用。(用的是c++)

    1)、创建一个新的空Win32控制台应用工程。

    2)、将"luatest.cpp"加入你的工程。

    3)、选择项目菜单中的属性菜单。

    4)、在"连接器"的"输入"栏目的"附加依赖项"中输入"lua5.1.lib"。

    5)、完成。

    如何编写test.lua脚本文件? 如下:

    print(“hello, lua!”)


    如何编写luatest.cpp?如下:

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

    /* Lua解释器指针 */
    lua_State* L;

    int main ( int argc, char *argv[] )
    {
    /* 初始化 Lua */
    L = lua_open();

    /* 载入Lua基本库 */
    luaL_openlibs(L);

    /* 运行脚本 */
    luaL_dofile(L, "test.lua的绝对路径");

    /* 清除Lua */
    lua_close(L);

    /* 暂停 */
    printf( "Press enter to exit…" );
    getchar();
    return 0;
    }

    运行输出:
    print ("hello, lua!")

    学习笔记 二

    1、Lua与c++交互之C++调用Lua
    注意点:
    1)、extern "C"
    2)、luaL_openlibs(L)
    3)、luaL_dofile(L, "test.lua")

    #include <stdio.h>

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

    /* the Lua interpreter */
    lua_State* L;


    int luaadd ( int x, int y )
    {
    int sum;

    /* the function name */
    lua_getglobal(L, "add");

    /* the first argument */
    lua_pushnumber(L, x);

    /* the second argument */
    lua_pushnumber(L, y);

    /* call the function with 2
    arguments, return 1 result */
    //说明调用的函数是带有2个参数和1个返回值
    lua_call(L, 2, 1);

    /* get the result */
    sum = (int)lua_tonumber(L, -1);
    lua_pop(L, 1);

    return sum;
    }

    int main(int argc, char **argv)
    {
    int sum;

    /* initialize Lua */
    L = lua_open();
    luaopen_base(L);

    /* load Lua base libraries */
    luaL_openlibs(L);

    /* load the script */
    luaL_dofile(L, "script/test.lua");

    /* call the add function */
    sum = luaadd( 10, 15 );

    /* print the result */
    printf( "The sum is %d ", sum );

    /* cleanup Lua */
    lua_close(L);

    printf( "Press enter to exit…" );
    getchar();
    return 0;
    }

    2、Lua与c++交互之Lua调用C++

    在lua中是以函数指针的形式调用函数, 并且所有的函数指针都必须满足如下此种类型:
    typedef int (*lua_CFunction) (lua_State *L);  
    也就是说, 我们在C++中定义函数时必须以lua_State为参数, 以int为返回值才能被Lua所调用. 但是不要忘记了, lua_State是支持栈的, 所以通过栈可以传递无穷个参数, 大小只受内存大小限制. 而返回的int值也只是指返回值的个数.真正的返回值都存储在lua_State的栈中. 我们通常的做法是做一个wrapper, 把所有需要调用的函数都wrap一下, 这样就可以调用任意的函数了.

    注意点:

    1)、lua中调用:get_sum(10, 20, 30, 40, 50,100);

    2)、int get_sum(lua_State *L)

    Lua是按照 __fastcall 的规则传递参数的,也就是从左到右一个个传。
    Lua压栈的顺序是:首先将函数压栈,然后将参数压栈。执行完毕后,将参数和函数都出栈,然后将返回值按顺序压栈。

    3)、函数体编写完,将该函数进行注册 lua_register( L, "get_sum", get_sum);

    #include <stdio.h>

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

    /* the Lua interpreter */
    lua_State* L;

    static int get_sum(lua_State *L)
    {
    //返回栈中元素的个数
    int n = lua_gettop(L);
    double sum = 0;
    int i;
    for (i = 1; i <= n; i++)
    {
    if (!lua_isnumber(L, i))
    {
    lua_pushstring(L, "Incorrect argument to 'sum'");
    lua_error(L);
    }
    sum += lua_tonumber(L, i);
    }
    /* push the sum */
    lua_pushnumber(L, sum);
    return 1;
    }


    int main(int argc, char **argv)
    {
    /* initialize Lua */
    L = lua_open();
    luaopen_base(L);

    /* load Lua base libraries */
    luaL_openlibs(L);

    lua_register(L, "get_sum", get_sum);
    /* load the script */
    /*Lua01.lua是这个C++程序调用的Lua文件*/
    luaL_dofile(L, "script/test.lua");

    /* print the result */
    lua_getglobal(L,"sum");
    printf("sum is: %d ", lua_tointeger(L,-1));

    /* cleanup Lua */
    lua_close(L);


    printf( "Press enter to exit…" );
    getchar();
    return 0;
    }

  • 相关阅读:
    为什么你应该(从现在开始就)写博客
    ASP.net 中使用Flexigrid详细教程之二直接使用数据库数据(有图有真相)
    保护眼睛的方法 (眼睛累了吗 来看看吧)
    程序员不如快递员?
    项目管理界面
    地址栏射击游戏!对,你没看错,就是在地址栏上玩的游戏,有图有真相!
    书写是为了更好的思考
    IT人员如何找到自己的时间?
    std::mem_fun_ref,mem_fun1_ref分析
    __declspec(selectany) 的作用是什么
  • 原文地址:https://www.cnblogs.com/duanxz/p/5408188.html
Copyright © 2011-2022 走看看