2013-06-16 7 views
5

तो मैं साझा सी ++ लाइब्रेरी में कॉल विधियों को कॉल करने के लिए पायथन का उपयोग कर रहा हूं। मुझे सी ++ से अजगर पर एक दोगुना लौटने का मुद्दा है। मैंने एक खिलौना उदाहरण बनाया है जो समस्या को प्रदर्शित करता है। संकलित करने के लिए स्वतंत्र महसूस करें और इसे आज़माएं।वापसी सी ++ पायथन के लिए डबल?

# Python imports 
from ctypes import CDLL 
import numpy as np 

# Open shared CPP library: 
cpplib=CDLL('./libsoexample.so') 
cppobj = cpplib.CPPClass_py() 

# Stuck on converting to short**? 
x = cpplib.func_py(cppobj) 
print 'x =', x 

यहाँ C++ (soexample.cpp):

यहाँ अजगर कोड (soexample.py) है

#include <iostream> 

using namespace std; 

class CPPClass 
{ 
    public: 
    CPPClass(){} 

    void func(double& x) 
    { 
    x = 1.0; 
    } 
}; 

// For use with python: 
extern "C" { 
    CPPClass* CPPClass_py(){ return new CPPClass(); } 
    double func_py(CPPClass* myClass) 
    {  
     double x; 
     myClass->func(x); 
     return x;  
    } 
} 

संकलित साथ:

g++ -fPIC -Wall -Wextra -shared -o libsoexample.so soexample.cpp 

जब मैं दौड़ता हूं मुझे मिलता है:

$ python soexample.py 
x = 0 

तो परिणाम प्रकार और मूल्य 0 में एक पूर्णांक है। क्या चल रहा है?

मैं संदर्भ द्वारा सरणी भरने के बारे में भी उत्सुक हूं।

उत्तर

6

ctypes documentation से:

डिफ़ॉल्ट कार्यों से सी int प्रकार वापस जाने के लिए माना जाता है। वापसी प्रकार फ़ंक्शन ऑब्जेक्ट की restype विशेषता सेट करके निर्दिष्ट किया जा सकता है।

यह काम करता है, तो आप निम्न के func_py के आपके उपयोग बदलने के लिए:

import ctypes 

func_py = cpplib.func_py 
func_py.restype = ctypes.c_double 
x = func_py(cppobj) 
print 'x =', x 

यह शायद इस सरल मामले के लिए काम करते हैं, आप भी CPPClass_py.restype रूप में अच्छी तरह निर्दिष्ट करना चाहिए।

+0

यह बहुत अच्छा काम करता है! 'CPPClass_py.restype' निर्दिष्ट करके आपका क्या मतलब है? – dillerj

+0

@ डिलरज यह एक और काम है जिसे आप निर्यात करते हैं। इसे restype विनिर्देश की भी आवश्यकता है। POINTER और संरचना की जांच करें। – zch

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