Обычный шепот, CFFI и инстанцирующие структуры - PullRequest
3 голосов
/ 31 декабря 2010

Я нахожусь в Google около 3 часов, в поисках решения этой "проблемы". Я пытаюсь выяснить, как создать экземпляр структуры C в lisp с использованием CFFI. У меня есть структура в C:

struct cpVect{cpFloat x,y;}

Просто верно? У меня есть автоматически сгенерированные привязки CFFI (я думаю, swig) к этой структуре:

(cffi:defcstruct #.(chipmunk-lispify "cpVect" 'classname)
    (#.(chipmunk-lispify "x" 'slotname) :double)
    (#.(chipmunk-lispify "y" 'slotname) :double))

Это генерирует структуру "VECT" со слотами: X и: Y, что подтверждает имена внешних слотов (обратите внимание, что я не генерировал привязки и не программировал библиотеку C (физика бурундука), но фактические функции выполняются звонил с лисп просто отлично).

Я искал повсюду, и, возможно, я видел его 100 раз и закрывал его, но я не могу понять, как создать экземпляр cpVect в lisp для использования в других функциях.

Обратите внимание на функцию:

cpShape *cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset)

Принимает не только cpVect, но и указатель на набор cpVects, что подводит меня ко второму вопросу: как создать указатель на набор структур?

Я был на http://common -lisp.net / project / cffi / manual / html_node / defcstruct.html и пробовал код, но получаю «Ошибка: несвязанная переменная: PTR» (я Я нахожусь в Clozure CL), не говоря уже о том, что выглядит только вернуть указатель, а не экземпляр.

Я новичок в Лиспе, до сих пор шел довольно сильно, но это первая настоящая проблема, с которой я столкнулся, которую я не могу понять. Спасибо!

Ответы [ 2 ]

2 голосов
/ 31 декабря 2010

Большинство реализаций Lisp не позволяют передавать структуры в стеке.Существует библиотека fsbv , которая использует libffi для добавления этой возможности.Если вы знаете структуру структуры, вы можете разложить ее вручную как серию базовых аргументов, но это, очевидно, хрупко.

1 голос
/ 01 января 2011

Не уверен, что это сильно поможет, но вы можете посмотреть на привязки rubi FFI для chipmunk: https://github.com/shawn42/chipmunk-ffi/blob/master/lib/chipmunk-ffi/vec2.rb

У Chipmunk есть раздел данных, в котором есть все вызовы встроенных методов, поэтому FFI может их использовать.Один из них называется cpv.cpv - это метод, который создает структуру cpVect.Не стесняйтесь начать разговор об этом на github w / me (shawn42).

...