2016-08-29 8 views
0

Я использую C-библиотеку для просмотра сети для определенного оборудования. У меня есть структура, называемая EyeTracker, которая содержит некоторые свойства.Определение двойного указателя для StructType с использованием ref?

Функция библиотеки вызывается с использованием EyeTracker**.

Из файл заголовка (код C):

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

Предполагается, что вы выделить достаточно памяти, чтобы соответствовать й количеству трекер с помощью указателя (надеюсь, что я осмысление здесь).

Мой вопрос: как я могу написать выше, используя javascript, ref и node-ffi?

Я до сих пор получил информацию о ОДИН трекер.

JavaScript код

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

Мне нужно, чтобы освободить место для numberOfTrackersToGet указателей на указатель на структуру типа EyeTracker.

ArrayType, похоже, не работает.

+3

Это [тег: C++] ... не [тег: с] или, может быть, [тег: Java] – LPs

+0

Я не думаю, что Java имеет – Caw

+1

структур я не думаю, C или C++ имеют 'пусть '... –

ответ

0

Непонятно, как работает function_call. Если он ожидает уже выделенного массива struct, тогда он может принимать только TobiiProEyeTracker*.

Если он записывает указатель внутренне выделенного массива параметра, то он будет использовать TobiiProEyeTracker**, но в данном случае нет никаких оснований, чтобы написать

Предполагается, что вы выделить достаточно памяти ...

Если функция требует предварительно выделяется массив STRUCT вы можете использовать это:

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(); 
+0

Я знаю, что это было плохое объяснение проблемы, попробует ваше предложение. – Mats

+0

Не '' 'tobiiEyeTrackerStructArray''' только ТИП, хотя? Мне не нужно создавать экземпляр с ** длиной **? – Mats

+0

, если функция tobii_pro_eyetracker_search ожидает 3 аргумента, почему, черт возьми, вы используете всего 2? И где вы прочитали, что вызывающему нужно выделить достаточно места? Согласно объявлению функции он будет писать указатель на структуру в первой переменной параметра. Мой ответ выше не будет работать. –

0

Это то, что Ende я работаю, я уверен, что он может быть одобрен.

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); 
     } 
    });