软件
swigwin3 用于生成c的lua包装lua5.2源代码步骤进入目录G:\sw\swigwin-3.0.12\Examples\lua\arrays执行 SWIG -lua example.i, 就会生成文件example_wrap.c进入lua source code G:\doc\lua\lua-5.2.4.tar\lua-5.2.4\src拷贝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 functionsand 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 itend}// 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 tablefunction print_table(t) print(table.concat(t,","))end-- a helper to print a C arrayfunction print_array(arr,len) for i=0,len-1 do io.write(example.int_getitem(arr,i),",") end io.write("\n")endmath.randomseed(0) -- init random--[[ version 1: passing a C array to the codelet's test call sort_int()this requires a C array, so is the hardest to use]]ARRAY_SIZE=10arr=example.new_int(ARRAY_SIZE)for i=0,ARRAY_SIZE-1 do example.int_setitem(arr,i,math.random(1000))endprint "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 itprint ""--[[ version 2: using %luacode to write a helpera simpler way is to use a %luacodewhich is a lua function added into the modulethis can do the conversion for usso 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)endprint "unsorted"print_table(t)example.sort_int2(t) -- calls lua helper which then calls Cprint "sorted"print_table(t)print ""--[[ version 3: use a typemapthis is the best wayit uses the SWIG-Lua typemaps to do the workone 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)/10endprint "unsorted"print_table(t)t=example.sort_double(t) -- replace t with the resultprint "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 moduleint main(int argc, char* argv[]){ lua_State *L; if (argc<2) { printf("%s: <filename.lua>\n", 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\n", argv[1]); lua_close(L); return 0;}
结果:
参考:
file:///G:/sw/swigwin-3.0.12/Doc/Manual/Lua.html#Lua_nn2