Saturday 15 September 2012

python - Wrapping simple c++ example with ctypes; segmentation fault -


मैंने एक निजी सदस्य वैरिएबल जोड़कर और बार () फ़ंक्शन:

  #include & lt; iostream & gt; वर्ग फू {निजी: डबल मी; सार्वजनिक: फू () {m = 2.344; }; शून्य बार () {std :: cout & lt; & lt; "हैलो, संख्या है" & lt; & lt; एम एंड एलटी; & lt; std :: endl; }}; Extern "C" {Foo * Foo_new () {नई Foo पर वापस जाएँ} } शून्य Foo_bar (Foo * foo) {foo- & gt; बार (); }}   

ctypes आवरण अपरिवर्तित था और यह है:

  से आयात करें ctypes import * lib = cdll.LoadLibrary ('। / Libfoo.so ') वर्ग फू (वस्तु): def __init __ (स्वयं): self.obj = lib.Foo_new () def बार (स्व): lib.Foo_bar (self.obj) f = Foo () f.bar ( )   

जब मैं अजगर कोड चलाता हूं (पहले से ही सी ++ कोड संकलित कर लेने के बाद), मुझे एक सेगमेंटेशन गलती मिल रही है जिस पर मैंने m में बार ()

सेग गलती नहीं होती है

  1. मूल कोड में
  2. अगर मैं m का मुद्रण हटाता हूं, लेकिन इसे रखता हूं
  3. यदि मैं m को बार () में किसी भी निश्चित संख्या के साथ बदलता हूं।

    मैं सच में हैरान हूं कि यह क्यों हो रहा है। चूंकि यह सीटीपीपी सीखने का एक प्रयोग है, किसी भी मदद की सराहना की जाएगी।

    यदि आप 64-बिट पायथन का उपयोग कर रहे हैं, तो आपको restype < कोड> और argtypes । अन्यथा ctypes को 32-बिट C int । के मानों को कास्ट करने के लिए डिफ़ॉल्ट। Ctypes आयात से * lib = CDLL ('। / Libfoo.so') Foo_new.argtypes = [] lib.Foo_new.restype = c_void_p lib.Foo_bar.argtypes = [c_void_p] lib.Foo_bar.restype = कोई भी

    यहां 2.7.5, स्रोत के लिए स्रोत लिंक हैं 64-बिट विंडोज़ के लिए एक सी <कोड> लंबे

  4. 32-बिट है, लेकिन यह 64-बिट अधिकांश अन्य 64-बिट प्लेटफ़ॉर्म पर है int को मजबूर करके परिणाम कम से कम सुसंगत है।

No comments:

Post a Comment