Вопрос

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

Это было полезно?

Решение

Наиболее распространенные реализации LISP не позволяют проходить структуры в стеке. Eсть Библиотека FSBV который использует Libffi, чтобы добавить эту возможность. Если вы знаете макет структуры, вы можете разложить ее вручную как серию основных аргументов, но это, очевидно, хрупкое.

Другие советы

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

У Bumpmunk есть раздел данных, в котором есть все встроенные вызовы методов, чтобы FFI мог их использовать. Один из них называется CPV. CPV - это метод, который создает структуру CPVECT. Не стесняйтесь начать разговор об этом на GitHub с мной (Shawn42).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top