2015-10-07 4 views
5

सिर्फ 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" का उपयोग कर रहा हूं।

उत्तर

1

इस खंड चेक आउट: http://docs.julialang.org/en/latest/manual/calling-c-and-fortran-code/#passing-pointers-for-modifying-inputs

कि पैटर्न का पालन करने के लिए, निम्नलिखित है, जो अन्य ccall() कोड पर मेरे लिए काम करता प्रयास करें। मुझे लगता है कि रेफरी {टी} स्मृति आवंटन का एक महत्वपूर्ण हिस्सा है, और var [] द्वारा dereferencing है।

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

धन्यवाद! test2 एक गलत पैटर्न है। अद्यतन [सेक्शन] से (http://docs.julialang.org/en/latest/manual/calling-c-and-fortran-code/#when-to-use-t-ptr-t-and-ref- टी), 'रेफरी' अनुशंसित है। – Gnimuc

संबंधित मुद्दे