Как использовать указатель динамического буфера в c-коде через расширение FFI в Ruby - PullRequest
2 голосов
/ 09 марта 2012

На стороне c-кода это выглядит так:

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

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

Как это происходит на Ruby?https://github.com/ffi/ffi/wiki/Examples упоминает о MemoryPointer, но в моем случае у меня уже есть этот буфер (созданный new_db ()), так как передать ссылку на буфер для edit_db () или как он должен идти?Здесь немного потеряно ..

1 Ответ

3 голосов
/ 11 марта 2012

edit_db () принимает указатель на указатель в качестве параметра.

Итак, вам нужно что-то вроде:

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
...