1

特定のハードウェアのネットワークを参照するために C ライブラリを使用しています。いくつかのプロパティを含むと呼ばれる構造体EyeTrackerがあります。

ライブラリ関数は を使用して呼び出されEyeTracker**ます。

ヘッダー ファイル (C コード) から:

API Status _eyetracker_search(EyeTracker** eyetrackers, size_t eyetrackers_size, size_t* count_eyetrackers);

ポインターを使用して x 量のトラッカーに適合するのに十分なメモリを割り当てることが期待されます (ここで意味をなすことを願っています)。

私の質問は次のとおりjavascriptです。refnode-ffi

ONEトラッカーで情報を取得できるようになりました。

JavaScript コード

let eyeTracker = StructType({ ... }),
    numberOfTrackersToGet = 10;
let eyeTrackerStructPtr = (new eyeTracker()).ref(),
    eyeTrackerStructPtrPtr = eyeTrackerStructPtr.ref();
eyetracker_search(eyeTrackerStructPtrPtr, numberOfTrackersToGet);

numberOfTrackersToGetEyeTracker タイプの Struct へのポインタへのポインタへのスペースを確保する必要があります。

ArrayType動作しないようです。

4

2 に答える 2

0

どのように機能するかは明らかではありませんfunction_call。すでに割り当てられている構造体配列が必要な場合は、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();
于 2016-08-30T00:55:38.423 に答える
0

これは最終的に機能したものであり、承認できると確信しています。

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);
       }
   });
于 2016-09-02T07:48:51.347 に答える