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