LuaJIT:将指向现有二维双精度数组的指针从 C 传递给脚本?
LuaJIT: pass pointer to existing 2D array of doubles from C to script?
我想通过将指针传递给脚本来直接在 LuaJIT 中操作现有的双精度二维数组。我发现不可能 create pointers to existing data。我可以将指向现有基元数组的指针从 C 传递到 LuaJIT 并从那里传递 read/write 吗?我知道数组和数据的大小,所以只需要能够 read/write 内存。
当然可以!
这是一个小测试脚本,我在 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
我想通过将指针传递给脚本来直接在 LuaJIT 中操作现有的双精度二维数组。我发现不可能 create pointers to existing data。我可以将指向现有基元数组的指针从 C 传递到 LuaJIT 并从那里传递 read/write 吗?我知道数组和数据的大小,所以只需要能够 read/write 内存。
当然可以! 这是一个小测试脚本,我在 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