Javascript 使用ref为StructType定义双指针?
我正在使用C库浏览网络以查找特定的硬件。 我有一个名为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
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的示例代码会使事情变得更容易。首先,让它发挥作用