2015-10-07 20 views
5

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".

risposta

1

Partenza questa sezione: http://docs.julialang.org/en/latest/manual/calling-c-and-fortran-code/#passing-pointers-for-modifying-inputs

Per seguire quel modello, provare la seguente, che lavora per me su altri ccall) Codice (. Penso che Ref {T} sia una parte importante dell'allocazione della memoria e del dereferenziamento da parte di var [].

# test 4 
bufferID = Ref{GLuint}(0) 
glGenBuffers(1, bufferID) 
@show bufferID[] 
+0

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

Problemi correlati