Question

Je suis sur Google environ, oh, 3 heures à la recherche d'une solution à ce « problème ». J'essaie de comprendre comment instancier une structure C en Lisp CFFI. J'ai struct dans c:

struct cpVect{cpFloat x,y;}

Simple droit? J'ai des liaisons de CFFI générées automatiquement (rasade, je pense) à cette structure:

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

Cela génère une struct « VECT » avec des fentes: X et: Y, nom-sous-étranger confirme (s'il vous plaît noter que je généré ni les liaisons ou programmées la bibliothèque C (physique tamia), mais les fonctions réelles sont appelé à Lisp très bien).

J'ai cherché loin, et peut-être que je l'ai vu 100 fois et passé sous silence, mais je ne peux pas comprendre comment créer une instance de cpVect en Lisp à utiliser dans d'autres fonctions.

Notez la fonction:

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

prend non seulement un cpVect, mais aussi un pointeur vers un ensemble de cpVects, ce qui me amène à ma deuxième question: comment puis-je créer un pointeur vers un ensemble de struct

Je suis allé à http://common-lisp.net /project/cffi/manual/html_node/defcstruct.html et essayé le code, mais obtenir « erreur: variable non: PTR » (je suis Clozure CL), sans oublier que les regards pour retourner uniquement un pointeur , pas une instance.

Je suis nouveau à Lisp, été va assez fort jusqu'à présent, mais c'est le premier vrai problème que je l'ai touché que je ne peux pas comprendre. Merci!

Était-ce utile?

La solution

La plupart des implémentations communes Lisp ne permettent pas de structures sur le passage pile. Il y a une bibliothèque fsbv qui utilise libffi pour ajouter cette capacité. Si vous connaissez la structure mise en page peut se décomposer manuellement comme une série d'arguments de base, mais qui est évidemment fragile.

Autres conseils

Je ne sais pas cela vous aidera beaucoup, mais vous pouvez regarder les fixations de IFF rubis pour tamia: https://github.com/shawn42/chipmunk -ffi / blob / maître / lib / tamia-ffi / vec2.rb

Chipmunk a une section de données qui a tous les appels de méthode inline si IFF peut les utiliser. L'un de ceux qui est appelé cpv. est la méthode cpv qui crée la struct cpVect. Ne hésitez pas à démarrer une conversation à ce sujet sur github w / me (shawn42).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top