तो मैं साझा सी ++ लाइब्रेरी में कॉल विधियों को कॉल करने के लिए पायथन का उपयोग कर रहा हूं। मुझे एक फंक्शन इनपुट के रूप में शॉर्ट्स के सी ++ 2 डी सरणी में एक numpy 2D सरणी को परिवर्तित करने में कोई समस्या है। मैंने एक खिलौना उदाहरण बनाया है जो समस्या को प्रदर्शित करता है। संकलित करने के लिए स्वतंत्र महसूस करें और इसे आजमाएं!एक 2 डी numpy सरणी C++ लघु ** में कनवर्ट करें?
#include <iostream>
using namespace std;
class CPPClass
{
public:
CPPClass(){}
void func(unsigned short **array)
{
cout << array[0][0] << endl;
}
};
// For use with python:
extern "C" {
CPPClass* CPPClass_py(){ return new CPPClass(); }
void func_py(CPPClass* myClass, unsigned short **array)
{
myClass->func(array);
}
}
जो मैं निम्न आदेश के साथ संकलन:
# 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**?
array = np.array([[1,2,3],[1,2,3]])
cpplib.func_py(cppobj,array)
यहाँ सी ++ पुस्तकालय (soexample.cpp) है:
यहाँ अजगर कोड (soexample.py) है
g++ -fPIC -Wall -Wextra -shared -o libsoexample.so soexample.cpp
जब मैं पाइथन फ़ाइल चलाता हूं, तो मुझे निम्न त्रुटि मिलती है:
>> python soexample.py
Traceback (most recent call last):
File "soexample.py", line 13, in <module>
cpplib.func_py(cppobj,array)
ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: Don't know how to convert parameter 2
मैं इस दुर्भाग्यपूर्ण TypeError
को सही तरीके से कैसे ठीक करूं?
मेरा मानना है कि सी की लघु ints 16 बिट कर रहे हैं। दूसरी तरफ डिफ़ॉल्ट numpy int आमतौर पर 32 बिट्स है। आप अपनी सरणी को 'array = np.array ([[1,2,3], [1,2,3]], dtype = np.uint16) के रूप में बनाने का प्रयास कर सकते हैं और देखें कि क्या होता है। – Jaime