lua笔记之userdata
生活随笔
收集整理的這篇文章主要介紹了
lua笔记之userdata
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.一直使用框架里封裝好的c庫,想著自己一點一點的寫些例子,學習下,以后需要c庫,可以自己寫了。
下邊是一個簡單的userdata的例子--數組操作。
newarray.c
#include "lua.h"
#include "lauxlib.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
typedef struct NumArray
{
int size;
double values[1];
}NumArray;
static int
lnew(lua_State *L)
{
int arr_size = luaL_checkint(L, 1);
if (arr_size <= 0)
{
assert(NULL);
}
size_t nbytes = sizeof(NumArray) + (arr_size - 1) * sizeof(double);
NumArray *na = (NumArray *)lua_newuserdata(L, nbytes);
na->size = arr_size;
return 1;
}
static int
lset(lua_State *L)
{
NumArray *na = (NumArray *)lua_touserdata(L, 1);
int idx = luaL_checkint(L, 2);
double value = luaL_checknumber(L, 3);
printf("idx %d, value %f
", idx, value);
luaL_argcheck(L, na != NULL, 1, "array expected");
luaL_argcheck(L, 1 <= idx && idx <= na->size , 2, "index out of range");
na->values[idx - 1] = value;
return 0;
}
static int
lget(lua_State *L)
{
NumArray *na = (NumArray *)lua_touserdata(L, 1);
int idx = luaL_checkinteger(L, 2);
luaL_argcheck(L, na != NULL, 1, "array expected");
luaL_argcheck(L, 1 <= idx && idx <= na->size, 2, "index out of range");
lua_pushnumber(L, na->values[idx - 1]);
return 1;
}
static int
lfind(lua_State *L)
{
NumArray *na = (NumArray *)lua_touserdata(L, 1);
assert(na != NULL);
double elem = luaL_checknumber(L, 2);
int idx;
for (idx = 0; idx < na->size; idx++)
{
if (na->values[idx] == elem)
{
lua_pushnumber(L, idx + 1);
return 1;
}
}
lua_pushnumber(L, -1);
return 1;
}
int
luaopen_newarray(lua_State *L)
{
luaL_checkversion(L);
luaL_Reg l[] =
{
{"new", lnew},
{"set", lset},
{"get", lget},
{"find", lfind},
{NULL, NULL},
};
luaL_newlib(L, l);
return 1;
}
編譯這個c文件,生成動態庫 , 命令: gcc -O2 -g -Wall -shared -fPIC -o newarray.so newarray.c -I/usr/include/lua5.2 -llua5.2當然我這里用的是lua5.2,用其它版本的需要更改-I,和-l的頭文件和鏈接庫的內容。
測試代碼:test.lua
local newarray = require "newarray"
print(newarray)
local na = newarray.new(1000)
newarray.set(na, 1, 100)
local value = newarray.find(na, 100)
if value ~= -1 then
print("value is ", value)
else
print("not exists")
end
編譯好newarray動態庫,就可以運行測試代碼了,安裝lua是,編譯后在src文件下有lua可執行文件,帶著這個運行 ./.../lua test.lua.
結果如下:
先讓程序跑起來,理解。
后續會加上詳細講解.望多多提意見,指正。。
總結
以上是生活随笔為你收集整理的lua笔记之userdata的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用路由器限制某IP的网速如何通过路由
- 下一篇: 12306.cn火车票自动订票软件