सिर्फ doc से कॉपी:pointer_from_objref() और Ref() का उपयोग करने का सही तरीका क्या है?
pointer_from_objref (object_instance):
जिसके परिणामस्वरूप PTR के अस्तित्व कचरा संग्रहण से वस्तु रक्षा नहीं करेंगे, तो आप यह सुनिश्चित करना चाहिए कि वस्तु के लिए संदर्भित रहता है पूरे समय पीआरआर का उपयोग किया जाएगा।
रेफरी {टी}:
एक वस्तु को सुरक्षित रूप से संदर्भ प्रकार टी इस प्रकार का वैध, सही प्रकार की जूलिया-आबंटित स्मृति को इंगित करने की गारंटी है की डेटा। अंतर्निहित डेटा को कचरा कलेक्टर द्वारा मुक्त करने से सुरक्षित किया जाता है जब तक कि रेफ स्वयं का संदर्भ दिया जाता है।
जब एक ccall तर्क (या तो एक पीटीआर या रेफ प्रकार के रूप में) के रूप में पारित किया जाता है, तो एक रेफ ऑब्जेक्ट को देशी सूचक में संदर्भित डेटा में परिवर्तित कर दिया जाएगा।
कोई अवैध (शून्य) रेफरी नहीं है।
मैं एक सी फ़ंक्शन में पॉइंटर पास करना चाहता हूं। दस्तावेज़ के अनुसार, यह का उपयोग कर pointer_from_objref
हमेशा सुरक्षित नहीं है की तरह लगता है, तो मैं बजाय Ref
इस्तेमाल करने की कोशिश:
# 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
परिणाम बताते हैं कि test 2
किसी भी त्रुटि के बिना एक अप्रत्याशित परिणाम देता है, लेकिन test 3
ठीक काम करता है जब मैं कन्वर्ट bufferID
एक सरणी में।
मेरा प्रश्न यह है कि test 2
कोई त्रुटि नहीं होने के साथ एक अप्रत्याशित परिणाम देगा। सुरक्षा के लिए, pointer_from_objref()
के बजाय हमेशा Ref()
का उपयोग करना सही है? यदि हां, क्या कोई दुष्प्रभाव हैं (उदा। प्रदर्शन)?
मैं julia v"0.4.0-rc1"
का उपयोग कर रहा हूं।
धन्यवाद! test2 एक गलत पैटर्न है। अद्यतन [सेक्शन] से (http://docs.julialang.org/en/latest/manual/calling-c-and-fortran-code/#when-to-use-t-ptr-t-and-ref- टी), 'रेफरी' अनुशंसित है। – Gnimuc