Ich habe mich nun mal an einem konkreteren Beispiel beschäftigt. Das hier ist dabei herausgekommen:
Code: Alles auswählen
#include <Python.h>
#include <vector>
struct Pt { double x, y; };
class PNL {
public:
typedef std::vector<Pt> PolyType;
std::vector<PolyType> polys;
void addPoly(PolyType poly);
};
void PNL::addPoly(PolyType poly) {
polys.push_back(poly);
}
static PyObject* add_poly(PNL *self, PyObject *args) {
PyObject *ptsList;
if(PyArg_ParseTuple(args, "O", &ptsList) < 0)
return NULL;
int ptNbr = PySequence_Length(ptsList);
PNL::PolyType poly;
for(unsigned int i = 0; i < ptNbr; i++) {
PyObject *pt = PySequence_GetItem(ptsList, i);
PyObject *x = PyTuple_GetItem(pt, 0);
PyObject *y = PyTuple_GetItem(pt, 1);
Pt point;
point.x = PyFloat_AsDouble(x);
point.y = PyFloat_AsDouble(y);
poly.push_back(point);
}
self->addPoly(poly);
Py_INCREF(Py_None);
return Py_None;
}
static PyMethodDef PNLPyType_methods[] = {
{"add_poly", (PyCFunction) add_poly, METH_VARARGS, "Adds a polygon."},
{NULL}
};
static PyTypeObject PNLPyType = {
PyObject_HEAD_INIT(NULL)
0,
"pnl.PNL",
sizeof(PNL)
};
static PyMethodDef pnl_module_methods[] = {
{NULL}
};
PyMODINIT_FUNC initpnl() {
PNLPyType.tp_new = PyType_GenericNew;
PNLPyType.tp_methods = PNLPyType_methods;
PNLPyType.tp_doc = "The PNL type.";
PNLPyType.tp_flags = Py_TPFLAGS_DEFAULT;
if(PyType_Ready(&PNLPyType) < 0)
return;
PyObject* pnl = Py_InitModule("pnl", pnl_module_methods);
Py_INCREF(&PNLPyType);
PyModule_AddObject(pnl, "PNL", (PyObject*) &PNLPyType);
}
int main(int argc, char *argv[]) {
Py_SetProgramName(argv[0]);
Py_Initialize();
initpnl();
}
Ich kann es in Python importieren, jedoch erhalte ich ein Segmentation fault, wenn ich folgende ausführe:
Irgendwas scheine ich vergessen zu haben, nur was?