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!

È stato utile?

Soluzione

implementazioni

??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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top