我想通过将指针传递给脚本来直接在LuaJIT中操作现有的二维双数组。我发现create pointers to existing data是不可能的。我可以将指针传递给从C到LuaJIT的现有基元数组,并从那里读/写吗?我知道数组和数据的大小,所以只需要能够读/写内存。
答案 0 :(得分:1)
当然可以! 这是一个小的测试脚本,我在C端分配并填充一个数组,然后通过函数在lua中得到一个指针。
// test.c
// gcc -std=c99 -O3 -Wall -fPIC -shared test.c -o libtest.so
#include <stdio.h>
#include <stdlib.h>
#define SIZE_A 10
double** get_pointer()
{
double** a = malloc(SIZE_A * sizeof(*a));
for (int i = 0; i < SIZE_A; ++i) {
a[i] = malloc(SIZE_A * sizeof(*a[i]));
for (int j = 0; j < SIZE_A; ++j) {
a[i][j] = i*SIZE_A + j;
printf("%.1f ", a[i][j]);
}
printf("\n");
}
printf("&a_c = %p\n", (void*)a);
return a;
}
和Lua脚本:
local ffi = require "ffi"
local testLib = ffi.load("./libtest.so")
ffi.cdef[[
double** get_pointer();
]]
local ptr = ffi.new("double**")
ptr = testLib.get_pointer()
print(ptr)
local size_a = 10
for i=0,size_a-1 do
for j=0,size_a-1 do
io.write(ptr[i][j], ' ')
end
io.write('\n')
end
for i=0,size_a-1 do
for j=0,size_a-1 do
ptr[i][j] = 2 * ptr[i][j]
end
end
for i=0,size_a-1 do
for j=0,size_a-1 do
io.write(ptr[i][j], ' ')
end
io.write('\n')
end