• Use swig + lua quick guide


    软件
    swigwin3    用于生成c的lua包装
    lua5.2源代码

    步骤
    进入目录G:swswigwin-3.0.12Examplesluaarrays
    执行 SWIG -lua     example.i, 就会生成文件example_wrap.c
    进入lua source code G:doclualua-5.2.4.tarlua-5.2.4src
    拷贝swig生成的几个c文件到该目录

    b编写一个新的mymain.c内容如下

    执行cl编译生成example.exe

    执行example.exe runme.lua

    代码:

    ===example.i

    /* File : example.i */
    %module example

    /* in this file there are two sorting functions
    and three different ways to wrap them.

    See the lua code for how they are called
    */

    %include <carrays.i>    // array helpers

    // this declares a batch of function for manipulating C integer arrays
    %array_functions(int,int)

    // this adds some lua code directly into the module
    // warning: you need the example. prefix if you want it added into the module
    // admittedly this code is a bit tedious, but its a one off effort
    %luacode {
    function example.sort_int2(t)
    -- local len=table.maxn(t) -- the len - maxn deprecated in 5.3
     local len=0; for _ in pairs(t) do len=len+1 end
     local arr=example.new_int(len)
     for i=1,len do
      example.int_setitem(arr,i-1,t[i]) -- note: C index is one less then lua index
     end
     example.sort_int(arr,len) -- call the fn
     -- copy back
     for i=1,len do
      t[i]=example.int_getitem(arr,i-1) -- note: C index is one less then lua index
     end
     example.delete_int(arr) -- must delete it
    end
    }

    // this way uses the SWIG-Lua typemaps to do the conversion for us
    // the %apply command states to apply this wherever the argument signature matches
    %include <typemaps.i>
    %apply (double *INOUT,int) {(double* arr,int len)};

    %inline %{
    extern void sort_int(int* arr, int len);
    extern void sort_double(double* arr, int len);
    %}

    ===runme.lua

    ---- importing ----
    if string.sub(_VERSION,1,7)=='Lua 5.0' then
        -- lua5.0 doesnt have a nice way to do this
        lib=loadlib('example.dll','luaopen_example') or loadlib('example.so','luaopen_example')
        assert(lib)()
    else
        -- lua 5.1 does
        require('example')
    end

    -- a helper to print a Lua table
    function print_table(t)
        print(table.concat(t,","))
    end

    -- a helper to print a C array
    function print_array(arr,len)
        for i=0,len-1 do
            io.write(example.int_getitem(arr,i),",")
        end
        io.write(" ")
    end

    math.randomseed(0)  -- init random


    --[[ version 1: passing a C array to the code
    let's test call sort_int()
    this requires a C array, so is the hardest to use]]
    ARRAY_SIZE=10
    arr=example.new_int(ARRAY_SIZE)
    for i=0,ARRAY_SIZE-1 do
        example.int_setitem(arr,i,math.random(1000))
    end
    print "unsorted"
    print_array(arr,ARRAY_SIZE)
    example.sort_int(arr,ARRAY_SIZE)
    print "sorted"
    print_array(arr,ARRAY_SIZE)
    example.delete_int(arr) -- must delete it
    print ""

    --[[ version 2: using %luacode to write a helper
    a simpler way is to use a %luacode
    which is a lua function added into the module
    this can do the conversion for us
    so we can just add a lua table directly
    (what we do is move the lua code into the module instead)
    ]]
    t={}
    for i=1,ARRAY_SIZE do
        t[i]=math.random(1000)
    end
    print "unsorted"
    print_table(t)
    example.sort_int2(t) -- calls lua helper which then calls C
    print "sorted"
    print_table(t)
    print ""

    --[[ version 3: use a typemap
    this is the best way
    it uses the SWIG-Lua typemaps to do the work
    one item of note: the typemap creates a copy, rather than edit-in-place]]
    t={}
    for i=1,ARRAY_SIZE do
        t[i]=math.random(1000)/10
    end
    print "unsorted"
    print_table(t)
    t=example.sort_double(t) -- replace t with the result
    print "sorted"
    print_table(t)

    ===mymain.c

    #include <stdio.h>
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"

    extern int luaopen_example(lua_State* L); // declare the wrapped module

    int main(int argc, char* argv[])
    {
     lua_State *L;
     if (argc<2)
     {
      printf("%s: <filename.lua> ", argv[0]);
      return 0;
     }
     L= luaL_newstate();
     luaL_openlibs(L);
     //luaopen_base(L);       // load basic libs (eg. print)
     //luaopen_math(L);
     luaopen_example(L);    // load the wrapped module
     if (luaL_loadfile(L, argv[1])==0) // load and run the file
      lua_pcall(L, 0, 0, 0);
     else
      printf("unable to load %s ", argv[1]);
     lua_close(L);
     return 0;
    }

    结果:

    参考:

    file:///G:/sw/swigwin-3.0.12/Doc/Manual/Lua.html#Lua_nn2

  • 相关阅读:
    设计一个栈,除了pop与push方法,还支持Min方法,可返回栈元素中的最小值,push、pop、min三个方法的时间复杂度必须是O(1)
    删除单向链表中间的某个节点,假定你只能访问该节点
    找出单向链表中倒数第K个节点
    关于ssh纠错笔记
    3维图像分割显示 标签: 图像分割level set3dmatlab 2015-04-16 17:59 228人阅读 评论(0)
    EM 算法 标签: clusteringalgorithm图像分割EM算法 2015-03-24 21:26 426人阅读 评论(0)
    kmeans算法分割图像 标签: kmeans图像分割算法 2015-03-23 20:02 509人阅读 评论(0)
    随机数
    IDL 日期时间函数整理
    显示程序运行时间_matlab
  • 原文地址:https://www.cnblogs.com/cutepig/p/9180944.html
Copyright © 2020-2023  润新知