2010-02-05 12 views
5

यह पायथन प्रश्न है। मैं एक चर एकपायथन में, SWIG द्वारा लिपटे uint16 [3] सरणी का उपयोग कैसे करें (यानी एक PySwigObject अनचाहे)?

>>> A 
<Swig Object of type 'uint16_t *' at 0x8c66fa0> 

>>> help(A) 
class PySwigObject(object) 
    Swig object carries a C/C++ instance pointer 

उदाहरण एक के द्वारा संदर्भित uint16 एक सन्निहित सरणी है [3] और समस्या अजगर से कि सरणी में पहुँच प्राप्त करने के लिए है।

पायथन में, मैं लम्बाई 3 का एक चर बी कैसे बना सकता हूं, जो मुझे ए में लिपटे सूचक द्वारा इंगित उसी स्मृति में पढ़ने/लिखने की सुविधा देता है?

मुझे लगता है कि समस्या के दो भाग हैं:

  1. कैसे ए से बाहर सूचक प्राप्त करने के लिए (मैं एक बड़ा घूँट वस्तु, नहीं लिपटे वस्तु को 0x8c66fa0 अंक लगता है)।
  2. मेमोरी पॉइंटर और ज्ञात डेटा प्रकार का उपयोग करके किसी प्रकार की पायथन सरणी को कैसे प्रारंभ करें। (Numpy एक सेबबफर विधि है, लेकिन क्या एक जरूरी चीज की जरूरत है।) शायद कुछ कास्टिंग की आवश्यकता होगी।

यह आसान मुझे लगता है कि होना चाहिए, लेकिन मैं पढ़ रहा था और एक से अधिक दिन के लिए हैकिंग!

दूसरे भाग को हल करने के लिए, मुझे लगता है कि एक उदाहरण इस तरह से शुरू हो सकता है:

>>> import numpy 
>>> C = numpy.ascontiguousarray([5,6,7],"uint16") 
>>> C 
array([5, 6, 7], dtype=uint16) 
>>> C.data 
<read-write buffer for 0x8cd9340, size 6, offset 0 at 0x8902f00> 

फिर "0x8902f00" और "uint16" और परीक्षण का उपयोग करता है, तो बी को बदलने (जो वेक्टर प्रकार के) बी बनाने की कोशिश [2] सी [2] में परिवर्तन का कारण बनता है।

आपके सुझावों या स्पष्ट उदाहरण के लिए बहुत धन्यवाद।

 
1. The wrapped pointer in PySwigObject A is available as A.__long__() . 

2. A raw pointer can be cast into an indexable type using ctypes as follows 

import ctypes 
pA = ctypes.cast(A.__long__(), ctypes.POINTER(ctypes.c_uint16)) 

फिर तत्वों पीए [0], पीए [के रूप में संबोधित किया जा सकता:

सादर,

ओवेन

उत्तर

6

अधिक पढ़ने और सामान बाहर की कोशिश कर के बाद, उत्तर इस प्रकार हैं 1] आदि

पीए मूल वस्तु के समान स्मृति को इंगित करता है, इसलिए मूल ऑब्जेक्ट हटा दिए जाने के बाद पीए का उपयोग न करने के लिए सावधान रहें।

यहाँ (पायथन में जाना जाता है प्रकार की एक कच्चे सूचक का उपयोग करने पर), समस्या का सिर्फ दूसरे भाग के लिए एक उदाहरण है

C = numpy.ascontiguousarray([5,6,7],"uint16") # make an array 
C 
rawPointer = C.ctypes.data 
pC = ctypes.cast(rawPointer, ctypes.POINTER(ctypes.c_uint16)) 
pC[0:3] 
pC[1]=100 
pC[0:3] 
C 

अजगर में उदाहरण चल रहा है दिखा देंगे कि दोनों सी [1] और पीसी [1] को 100 में बदल दिया गया है।

हल हो गया। :)

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