Преобразование буфера node.js в экземпляр ref-struct

1

Я пишу программу как в C, так и в Javascript (на node.js), используя ffi, ref и несколько других пакетов ref-.

У меня есть следующий код, который я компилирую в библиотеку libfun.so:

fun.c

#include "fun.h"
#include <stdio.h>
#include <stdlib.h>


void fill_array(void **data_array, int length)
{
    int i;
    for (i = 0; i < length; i++) {
        data_array[i] = malloc(sizeof(data));
        ((data *)data_array[i])->id = 256;
        ((data *)data_array[i])->message = 512;
    }   
}

void print_array(void **data_array, int length)
{
    int i = 0;
    for (i = 0; i < length; i++) {
        printf("(%d, %d)\n", ((data *)data_array[i])->id, 
               ((data *)data_array[i])->message);
    }
}

fun.h

#ifndef fun_h__
#define fun_h__

typedef struct {
    int id;
    int message;
} data;

void fill_array(void **,int);
void print_array(void **,int);

#endif

fun.js

var ffi = require('ffi');
var Struct = require('ref-struct');
var ref = require('ref');
var ArrayType = require('ref-array');

// js analog of the data struct from fun.h
var Data = Struct({
  id: ref.types.int,
  message: ref.types.int,
});
// js analog of the type data *
var DataPointer = ref.refType(Data);

// pvoid is the js analog of void * in C
var pvoid = ref.refType(ref.types.void);
var PVoidArray = ArrayType(pvoid);

// set up our foreign functions from libfun
var libfun = ffi.Library('./libfun', {
    'fill_array' : ['void', [PVoidArray,ref.types.int]],
    'print_array' : ['void', [PVoidArray, ref.types.int]]
});
var myArray = new PVoidArray(10);
libfun.fill_array(myArray,10);
libfun.print_array(myArray,10); // this prints the array of structs correctly, from the C side

Мой вопрос: как я могу напечатать массив структур со стороны Javascript? Я хочу передать myArray как PVoidArray. Я не хочу создавать массив структур (т. var DataArray = ArrayType(DataPointer) Создавать var DataArray = ArrayType(DataPointer) и использовать это вместо PVoidArray везде).

Начнем с myArray [0]. Можем ли мы использовать нашу переменную Data (гибким способом), используя myArray[0] и создать структуру? Как и некоторая функция bufferToArray(myArray[0],Data) == a Data instance containing the data of myArray[0].

  • 2
    Я не могу проверить это, но дайте мне знать, если это работает: ref.get(myArray, someIndex, DataPointer).deref() или ref.get(ref.get(myArray, someIndex), 0, Data)
  • 0
    ref.get(myArray.buffer,0,DataPointer).deref() работает. Благодарю. Я буду рад принять это как ответ.
Теги:
ffi

1 ответ

1
Лучший ответ

Если посмотреть на документацию для ref.get(), вы можете использовать это:

ref.get(myArray.buffer, index, DataPointer).deref()

вернет экземпляр Data из index myArray.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню