Common Lisp, CFFI, e istanziazione C struct
-
14-10-2019 - |
Domanda
Sono stato su google per circa, oh, 3 ore alla ricerca di una soluzione a questo "problema". Sto cercando di capire come creare un'istanza di una struttura C in Lisp utilizzando CFFI. Ho uno struct in C:
struct cpVect{cpFloat x,y;}
giusto Semplice? Ho attacchi CFFI generate automaticamente (sorso, credo) a questo struct:
(cffi:defcstruct #.(chipmunk-lispify "cpVect" 'classname)
(#.(chipmunk-lispify "x" 'slotname) :double)
(#.(chipmunk-lispify "y" 'slotname) :double))
Questo genera una struttura "VECT" con slot: X e Y, quali esteri-slot-nomi conferma (si noti che né ho generato le associazioni o programmato libreria C (fisica scoiattolo), ma le funzioni reali stanno essendo chiamato da Lisp bene).
Ho cercato in lungo e in largo, e forse l'ho visto 100 volte e sorvolata, ma io non riesco a capire come creare un'istanza di cpVect in Lisp da utilizzare in altre funzioni.
Nota la funzione:
cpShape *cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset)
prende non solo un cpVect, ma anche un puntatore ad una serie di cpVects, che mi porta alla mia seconda domanda: come faccio a creare un puntatore a una serie di struct
Sono stato a http://common-lisp.net /project/cffi/manual/html_node/defcstruct.html e provato il codice, ma ottenere "Errore: variabile Unbound: PTR" (io sono in Clozure CL), per non parlare che guarda per restituire solo un puntatore , non è un caso.
Sono nuovo di Lisp, sta andando piuttosto forte fino ad ora, ma questo è il primo vero problema che ho colpito che io non riesco a capire. Grazie!
Soluzione
??La maggior parte Common Lisp non consentono strutture di passaggio sulla pila. C'è un fsbv biblioteca che utilizza libffi aggiungere questa capacità. Se si conosce la struttura del layout è possibile scomporre manualmente come una serie di argomenti di base, ma che è ovviamente fragile.
Altri suggerimenti
Non sono sicuro che questo aiuterà molto, ma si poteva guardare le associazioni rubino FFI per chipmunk: https://github.com/shawn42/chipmunk -ffi / blob / master / lib / chipmunk-FFI / vec2.rb
Chipmunk ha una sezione di dati che ha tutte le chiamate di metodo in linea in modo da FFI può usarli. Uno di questi si chiama CPV. CPV è il metodo che crea lo struct cpVect. Sentitevi liberi di avviare una conversazione su questo su github w / me (shawn42).