Common Lisp, CFFI и создание экземпляров c-структур

Я сидел в гугле около трех часов в поисках решения этой «проблемы». Я пытаюсь понять, как создать экземпляр структуры 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 (физика бурундука), но фактические функции вызываются из lisp просто хорошо).

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

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

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

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

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

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


person andrew    schedule 31.12.2010    source источник
comment
Работает для коллекций указателей... половина проблемы. Спасибо!!   -  person andrew    schedule 02.01.2011


Ответы (2)


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

person Ramarren    schedule 31.12.2010
comment
Оказывается, мне не нужно было выделять память в стеке, но ваш ответ заставил меня копнуть глубже. Спасибо. - person andrew; 02.01.2011

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

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

person shawn42    schedule 01.01.2011
comment
Оказывается, привязка CFFI на самом деле разрывается, поэтому каждый раз, когда требуется cpVect, вы передаете vect-x и vect-y в качестве отдельных аргументов (решает проблему создания в стеке). Что касается распределения указателей, CFFI работает отлично. - person andrew; 02.01.2011