LuaJIT:将指针传递给从C到脚本的现有二维双精度数组?

时间:2015-03-03 19:31:47

标签: arrays pointers lua ffi luajit

我想通过将指针传递给脚本来直接在LuaJIT中操作现有的二维双数组。我发现create pointers to existing data是不可能的。我可以将指针传递给从C到LuaJIT的现有基元数组,并从那里读/写吗?我知道数组和数据的大小,所以只需要能够读/写内存。

1 个答案:

答案 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