semplicemente copiando dalla doc:qual è il modo giusto per usare pointer_from_objref() e Ref()?
pointer_from_objref (object_instance):
L'esistenza del conseguente Ptr non protegge l'oggetto dalla raccolta dei rifiuti, quindi è necessario assicurarsi che l'oggetto rimane riferimento per per tutto il tempo che verrà utilizzato il Ptr.
Rif {T}:
Un oggetto che fa riferimento in modo sicuro i dati di tipo T. Questo tipo è garantito per puntare a validi, la memoria Julia-allocata del tipo corretto. I dati sottostanti sono protetti dalla liberazione dal garbage collector fino a quando viene fatto riferimento al Ref stesso.
Quando viene passato come argomento ccall (o come tipo Ptr o Ref), un oggetto Ref verrà convertito in un puntatore nativo ai dati a cui fa riferimento.
Nessun riferimento (NULL) non valido.
voglio passare un puntatore ad una funzione c. secondo il documento, sembra come l'utilizzo di pointer_from_objref
non è sempre sicuro, in modo cerco di usare Ref
invece:
# test 1
bufferID = convert(GLuint, 0)
glGenBuffers(1, pointer_from_objref(bufferID))
@show bufferID
out => bufferID = 0x00000001 # ok
# test 2
bufferID = convert(GLuint, 0)
glGenBuffers(1, Ref(bufferID))
@show bufferID
out => bufferID = 0x00000000 # unexpected result
# test 3
bufferID = GLuint[0]
glGenBuffers(1, Ref(bufferID))
@show bufferID[]
out => bufferID[] = 0x00000001 # ok
i risultati mostrano che test 2
dà un risultato inatteso, senza alcun errore, ma test 3
funziona bene quando si converte bufferID
in una matrice.
la mia domanda è perché test 2
darà un risultato inaspettato senza errori. per sicurezza, è giusto usare sempre Ref()
invece di pointer_from_objref()
? se sì, ci sono effetti collaterali (ad esempio prestazioni)?
sto usando julia v"0.4.0-rc1"
.
grazie! test2 è uno schema errato. dalla [sezione] aggiornata (http://docs.julialang.org/en/latest/manual/calling-c-and-fortran-code/#when-to-use-t-ptr-t-and-ref- t), 'Ref' è quello raccomandato. – Gnimuc