Javascript 使用ref为StructType定义双指针?

Javascript 使用ref为StructType定义双指针?,javascript,c,ref,node-ffi,Javascript,C,Ref,Node Ffi,我正在使用C库浏览网络以查找特定的硬件。 我有一个名为EyeTracker的结构,它包含一些属性 使用EyeTracker**调用库函数 从头文件(C代码): 您需要分配足够的内存来容纳x个使用指针的跟踪器(希望我在这里讲得通) 我的问题是:如何使用javascript、ref和node-ffi编写上述代码 到目前为止,我已经能够在ONE跟踪器上获取信息 JavaScript代码 let eyeTracker = StructType({ ... }), numberOfTrackers

我正在使用C库浏览网络以查找特定的硬件。 我有一个名为
EyeTracker
的结构,它包含一些属性

使用
EyeTracker**
调用库函数

从头文件(C代码):

您需要分配足够的内存来容纳x个使用指针的跟踪器(希望我在这里讲得通)

我的问题是:如何使用
javascript
ref
node-ffi
编写上述代码

到目前为止,我已经能够在ONE跟踪器上获取信息

JavaScript代码

let eyeTracker = StructType({ ... }),
    numberOfTrackersToGet = 10;
let eyeTrackerStructPtr = (new eyeTracker()).ref(),
    eyeTrackerStructPtrPtr = eyeTrackerStructPtr.ref();
eyetracker_search(eyeTrackerStructPtrPtr, numberOfTrackersToGet);
我需要给
numberOfTrackersToGet
指向EyeTracker类型结构的指针留出空间


ArrayType
似乎不起作用。

不清楚
函数调用的工作原理。如果它需要一个已经分配的结构数组,那么它可以只接受
TobiiProEyeTracker*

如果它将内部分配数组的指针写入参数,那么它将使用
TobiiProEyeTracker**
,但在这种情况下,没有理由写入

您需要分配足够的内存

如果函数需要预分配的结构数组,则可以使用:

var ArrayType = require('ref-array')

var intPtr = ref.refType('int');
var TobiiProEyeTracker = StructType({ ... })
var tobiiEyeTrackerStructPtr = ref.refType(TobiiProEyeTracker);
var tobiiEyeTrackerStructPtrPtr = ref.refType(tobiiEyeTrackerStructPtr);

var lib = ffi.Library('libnamehere', {
  'tobii_pro_eyetracker_search': [ 'void', [ tobiiEyeTrackerStructPtrPtr, 'int', intPtr ] ]
});

var numberOfTrackersToGet = 10
var tobiiEyeTrackerStructArray = ArrayType(TobiiProEyeTracker, numberOfTrackersToGet)
var TobiiProEyeTrackerSize = ...
var countPtr = ref.alloc('int'); // allocate a pointer to int

lib.tobii_pro_eyetracker_search(tobiiEyeTrackerStructArray.ref(), TobiiProEyeTrackerSize, countPtr);

var count = countPtr.deref();

尚不清楚
函数调用
是如何工作的。如果它需要一个已经分配的结构数组,那么它可以只接受
TobiiProEyeTracker*

如果它将内部分配数组的指针写入参数,那么它将使用
TobiiProEyeTracker**
,但在这种情况下,没有理由写入

您需要分配足够的内存

如果函数需要预分配的结构数组,则可以使用:

var ArrayType = require('ref-array')

var intPtr = ref.refType('int');
var TobiiProEyeTracker = StructType({ ... })
var tobiiEyeTrackerStructPtr = ref.refType(TobiiProEyeTracker);
var tobiiEyeTrackerStructPtrPtr = ref.refType(tobiiEyeTrackerStructPtr);

var lib = ffi.Library('libnamehere', {
  'tobii_pro_eyetracker_search': [ 'void', [ tobiiEyeTrackerStructPtrPtr, 'int', intPtr ] ]
});

var numberOfTrackersToGet = 10
var tobiiEyeTrackerStructArray = ArrayType(TobiiProEyeTracker, numberOfTrackersToGet)
var TobiiProEyeTrackerSize = ...
var countPtr = ref.alloc('int'); // allocate a pointer to int

lib.tobii_pro_eyetracker_search(tobiiEyeTrackerStructArray.ref(), TobiiProEyeTrackerSize, countPtr);

var count = countPtr.deref();

这就是最终成功的原因,我相信它会被批准的

let EyeTracker = StructType({ ... fields are visible below })
let dummyCount = ref.alloc("int", 0),
    count = 5,
    tempArray = [],
    buff = Buffer.alloc(count * ref.ref(dummyCount).byteLength),
    pointerSize = ref.ref(dummyCount).byteLength; // byteLength should give the size of a pointer
    _eyetracker_search.async(buff, count, dummyCount, (err, status) => {
    for (let i = 0, len = buff.length; i < len; i += pointerSize) {
        let p = ref.readPointer(buff, i, EyeTracker.size),
            offset = 0,
            struct = new EyeTracker({
                uri: ref.readCString(ref.readPointer(p, offset)),
                device_name: ref.readCString(ref.readPointer(p, (offset += pointerSize))),
                serial_number: ref.readCString(ref.readPointer(p, (offset += pointerSize))),
                model: ref.readCString(ref.readPointer(p, (offset += pointerSize))),
                generation: ref.readCString(ref.readPointer(p, (offset += pointerSize))),
                firmware_version: ref.readCString(ref.readPointer(p, (offset += pointerSize)))
           });
           tempArray.push(struct);
       }
   });
let EyeTracker=StructType({…字段在下面可见})
设dummyCount=ref.alloc(“int”,0),
计数=5,
tempArray=[],
buff=缓冲区.alloc(计数*参考参考(dummyCount).ByTeleLength),
pointerSize=ref.ref(dummyCount).byteLength;//ByTeleLength应该给出指针的大小
_eyetracker_search.async(buff,count,dummyCount,(err,status)=>{
for(设i=0,len=buff.length;i
这就是最终有效的方法,我相信它可以被批准

let EyeTracker = StructType({ ... fields are visible below })
let dummyCount = ref.alloc("int", 0),
    count = 5,
    tempArray = [],
    buff = Buffer.alloc(count * ref.ref(dummyCount).byteLength),
    pointerSize = ref.ref(dummyCount).byteLength; // byteLength should give the size of a pointer
    _eyetracker_search.async(buff, count, dummyCount, (err, status) => {
    for (let i = 0, len = buff.length; i < len; i += pointerSize) {
        let p = ref.readPointer(buff, i, EyeTracker.size),
            offset = 0,
            struct = new EyeTracker({
                uri: ref.readCString(ref.readPointer(p, offset)),
                device_name: ref.readCString(ref.readPointer(p, (offset += pointerSize))),
                serial_number: ref.readCString(ref.readPointer(p, (offset += pointerSize))),
                model: ref.readCString(ref.readPointer(p, (offset += pointerSize))),
                generation: ref.readCString(ref.readPointer(p, (offset += pointerSize))),
                firmware_version: ref.readCString(ref.readPointer(p, (offset += pointerSize)))
           });
           tempArray.push(struct);
       }
   });
let EyeTracker=StructType({…字段在下面可见})
设dummyCount=ref.alloc(“int”,0),
计数=5,
tempArray=[],
buff=缓冲区.alloc(计数*参考参考(dummyCount).ByTeleLength),
pointerSize=ref.ref(dummyCount).byteLength;//ByTeleLength应该给出指针的大小
_eyetracker_search.async(buff,count,dummyCount,(err,status)=>{
for(设i=0,len=buff.length;i这是……不是…或者我不认为java有结构,不认为C或C++有<代码>让…我假设它是节点FFI(从节点.js调用一个C LIB),所以发布的代码将在JavaScript中。标签是No.js的异函数接口,它表明所显示的代码可以用JavaScript编写,但是正在尝试调用C库。这是唯一有意义的标记-是一个非实体(2个问题,没有追随者,没有标记wiki);与C或C++无关,因为它描述了不是C或C++的一部分的关键字。这是……不是…或者我不认为java有结构,不认为C或C++有<代码> > <代码>……我假设它是节点FFI(从节点.js调用一个C LIB),所以发布的代码将在JavaScript中。这表明显示的代码可能是用JavaScript编写的,但正在尝试调用C库。这是唯一有意义的标记-是一个非实体(2个问题,没有追随者,没有标记wiki);与C或C++无关,因为它描述了不是C或C++的一部分的关键字。我知道这是对问题的一个很差的解释,会尝试你的建议。不是代码> toBieYeTrrErrErgStRealEng/<代码>只是一种类型吗?我不需要创建一个长度为的实例吗?如果tobii_pro_eyetracker_搜索函数需要3个参数,为什么只使用2个?你在哪里读到呼叫者需要分配足够的空间?根据函数声明,它将在第一个参数变量中写入指向结构的指针。我上面的答案也不起作用。显示C的示例代码会使事情变得更容易。首先,让它发挥作用