luajit使用ffi时自动获取C中定义的数组长度

    在使用luajit的ffi.cdef定义的struct C结构体时,部分字段使用数组的方式定义,查遍了各种资料,没有找到如何自动获取数组长度的方法。如有哪位大牛知道其他简单的办法获取数组长度的,烦告知。先感谢了。

    以下是我通过lua的字符串匹配方式获取数组长度,和数组定义数据类型的方法。

local ffi = require("ffi")

ffi.cdef [[
    typedef int rock;
    typedef struct {
        int a;
        char c[5];
        int d[5];
        uint64_t ss[17];
        long long e[7][8][87][98];
    } Test;
]]

local c = ffi.new("Test")
ffi.fill(c, ffi.sizeof(c), 0)


-- 分析C结构体中定义的一维或多维数组中定义的具体维数
-- 返回格式为逗号分隔符隔开的字符串,例如: 2,3,15,8
local function analyze_array_cdata(array_cdata)
    local ctype_string = tostring(ffi.typeof(array_cdata))
    
    local tmp, count = string.gsub(ctype_string, "%[%d+%]", "")
    assert(tmp ~= ctype_string)
    
    local pat = "^ctype<[%w _]+ %(&%)"
    local rep = ""
    for i = 1, count do
        pat = pat .. "%[(%d+)%]"
        if i ~= 1 then
            rep = rep .. string.format(",%%%d", i)
        else
            rep = rep .. string.format("%%%d", i)
        end
    end
    pat = pat .. ">$"
    local typedef = string.gsub(ctype_string, pat, rep)
    assert(typedef ~= ctype_string, typedef)
    
    return typedef
end

-- 分析C结构体中定义的一维或多维数组中定义的数据类型和具体维数
-- 返回格式为逗号分隔符隔开的字符串,例如: int,2,3,8 或 int64_t,2,8
local function analyze_array_cdata_ex(array_cdata)
    local ctype_string = tostring(ffi.typeof(array_cdata))
    
    local tmp, count = string.gsub(ctype_string, "%[%d+%]", "")
    assert(tmp ~= ctype_string)
    
    local pat = "^ctype<([%w _]+) %(&%)"
    local rep = "%1"
    for i = 1, count do
        pat = pat .. "%[(%d+)%]"
        rep = rep .. string.format(",%%%d", i+1)
    end
    pat = pat .. ">$"
    local typedef = string.gsub(ctype_string, pat, rep)
    assert(typedef ~= ctype_string, typedef)
    
    return typedef
end

print(analyze_array_cdata(c.e), ",")
print(analyze_array_cdata_ex(c.e), ",")

-- 分析C结构体中定义的一维或多维数组中定义的数据类型
local function get_array_width(array_cdata)
    local typeof = tostring(ffi.typeof(array_cdata))
    local typedef = string.gsub(typeof, "^ctype<([%w _]+) %(&%)[%d%[%]]+>$", "%1")
    assert(typeof ~= typedef, typedef)
    return ffi.sizeof(typedef)
end

-- 测量C结构体中定义的一维或多维数组的总长度
local function get_array_length(array_cdata)
    return ffi.sizeof(array_cdata) / get_array_width(array_cdata)
end

print("====>>", get_array_width(c.ss))
print("****>>", get_array_length(c.ss))

 

你可能感兴趣的:(cocos2d-x,C/C++,Lua,luajit,ffi)