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

我想直接通过向脚本传递指针来操作现有的双精度 2D 数组。我发现无法 创建 指向现有数据的指针。我能否从 C 中将指向现有原始数组的指针传递给 LuaJIT 并从那里读取/写入?我知道数组和数据的大小,所以只需要能够读写内存。

点赞
用户786559
用户786559

当然能!

这里有一个小测试脚本,在 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
2015-03-05 10:02:32