Cómo usar el puntero de búfer dinámico de código c nativo a través de la extensión FFI de Ruby

On c-code side it goes:

/* Declarations */
DATABLOCK *new_db ();
edit_db(DATABLOCK **db);

/* Usage */
db = new_db();
edit_db(&db);

How this goes on Ruby? https://github.com/ffi/ffi/wiki/Examples mentions about MemoryPointer but on my case I ya haya utilizado have that buffer (created by new_db()), so how to pass reference to buffer for edit_db() or how it should go? Bit lost here..

preguntado el 09 de marzo de 12 a las 14:03

1 Respuestas

edit_db() takes a pointer to a pointer as its parameter.

So, you need something like:

db = LibDB.new_db()

# pack the 'db' pointer into a temporary bit of memory
dbp = FFI::MemoryPointer.new(:pointer)
dbp.write_pointer(db)

# equivalent of edit_db(&db);
LibDB.edit_db(dbp)

# read the 'db' pointer back out in case edit_db altered the actual pointer value
db = dbp.read_pointer

respondido 10 mar '12, 23:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.