2010-12-31 2 views
3

Я был в google около, о, 3 часа ищет решение этой «проблемы». Я пытаюсь понять, как создать экземпляр структуры C в lisp с помощью CFFI. У меня есть структура в c:Общие lisp, CFFI и создание экземпляров c structs

struct cpVect{cpFloat x,y;} 

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

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

Это порождает STRUCT «Vect» со слотами: X и: Y, которые в иностранном игральных именах подтверждают (Пожалуйста, обратите внимание, что Я не создавал привязки или не программировал библиотеку C (физика бурундук), но фактические функции вызывают из lisp просто отлично).

Я искал широко и, возможно, видел его 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), не говоря уже о том, что выглядит только для возврата указателя, а не экземпляра.

Я новичок в lisp, до сих пор довольно силен, но это первая реальная проблема, с которой я столкнулся, я не могу понять. Благодаря!

+1

выделить с FOREIGN-ALLOC? –

+0

Работы для коллекций указателей ... половина проблемы. Спасибо!! – andrew

ответ

2

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

+0

Оказывается, мне не нужно было выделять в стеке, но ваш ответ заставил меня копать глубже. Спасибо. – andrew

1

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

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

+0

Выключает привязку CFFI, так что каждый раз, когда требуется cpVect, вы передаете vect-x и vect-y в виде отдельных аргументов (решает проблему создания в стеке). Что касается выделения указателей, CFFI работает отлично. – andrew