2016-04-26 12 views
9

मैं अपने सी मॉड्यूल में एक फ़ंक्शन के तर्क के रूप में uint8_t की एक सरणी के रूप में पास करना चाहता हूं।पायथन एक्सटेंशन पर uint8_t से कैसे निपटें?

मुझे इस सरणी को सीधे पार्स करने के लिए कोई विधि नहीं मिल सका, इसलिए मैं इसे PyObject_t पर पार्स कर रहा हूं और फिर PyTuple_t ऑब्जेक्ट के रूप में पुनरावृत्त कर रहा हूं। इस तरह, मुझे इस tuple के प्रत्येक तत्व PyObject_t को uint8_t पर डालना होगा।

मैं ऐसा कैसे कर सकता हूं, एक बार जब कोई PyInt_FromUINT8_t फ़ंक्शन या ऐसा कुछ भी नहीं है?

उत्तर

5

आप आमतौर पर unsigned char का उपयोग कर आसानी से दूर हो सकते हैं। Parsing Arguments के अनुसार तुम सिर्फ करने के लिए सक्षम होना चाहिए:।

uint8_t b; 
if (!PyArg_ParseTuple("b", &b)) { 
    return NULL; 
} 

यदि नहीं सीधे तर्क (जैसे आप एक PyObject साथ काम कर रहे का उपयोग कर, बस PyInt_*, PyLong_* या PyNumber_* कार्यों में से एक (https://docs.python.org/3/c-api/number.html?highlight=pynumber#c.PyNumber_AsSsize_t का उपयोग करें)

एक uin8_t से एक PyObject में कनवर्ट कर रहा है, साथ ही सरल है आप PyInt_FromLong या PyLong_FromLong उपयोग कर सकते हैं

+0

मैं सरणियों के साथ काम कर रहा हूँ। इस मामले में, पर एक PyTuple पुनरावृति या PyList Pyin का उपयोग कर t_FromLong एक अवैध स्मृति पहुंच का कारण नहीं बन जाएगा? यह फ़ंक्शन 4 या 8 बाइट्स पढ़ने की कोशिश करेगा लेकिन सूची के प्रत्येक तत्व में केवल 1 बाइट आवंटित किया गया है। –

+0

'PyXXX' फ़ंक्शंस में से कोई भी पूर्णांक के लिए पॉइंटर्स का उपयोग नहीं करता है, लेकिन उन्हें मूल्य से वापस कर देता है; इसलिए उदाहरण के लिए 'PyInt_FromLong' एक 'int' को तर्क के रूप में स्वीकार करेगा, और यह सामान्य प्रकार के रूपांतरण और पूर्णांक जबरन के अधीन होगा। क्या आप कुछ और करने की कोशिश कर रहे हैं जो आप करने की कोशिश कर रहे हैं? –

+0

मैंने प्रश्न अपडेट किया। जांचें कि यह अब स्पष्ट है या नहीं। –

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