Piszę funkcję C, która przyjmuje Python tuple
z ints
jako argument.Python tuple to C array
static PyObject* lcs(PyObject* self, PyObject *args) {
int *data;
if (!PyArg_ParseTuple(args, "(iii)", &data)) {
....
}
}
jestem w stanie konwertować krotki o stałej długości (tutaj 3), ale jak uzyskać C array
od A tuple
dowolnej długości?
import lcs
lcs.lcs((1,2,3,4,5,6)) #<- C should receive it as {1,2,3,4,5,6}
EDIT
Zamiast krotki mogę przekazać ciąg z liczb oddzielonych ';'. Np. "1; 2; 3; 4; 5; 6 'i oddzielić je do tablicy w kodzie C. Ale nie sądzę, żeby to był właściwy sposób.
static PyObject* lcs(PyObject* self, PyObject *args) {
char *data;
if (!PyArg_ParseTuple(args, "s", &data)) {
....
}
int *idata;
//get ints from data(string) and place them in idata(array of ints)
}
EDIT (roztwór)
Chyba znalazłem rozwiązanie:
static PyObject* lcs(PyObject* self, PyObject *args) {
PyObject *py_tuple;
int len;
int *c_array;
if (!PyArg_ParseTuple(args, "O", &py_tuple)) {
return NULL;
}
len = PyTuple_Size(py_tuple);
c_array= malloc(len*4);
while (len--) {
c_array[len] = (int) PyInt_AsLong(PyTuple_GetItem(py_tuple, len));
//c_array is our array of ints :)
}
va_list? ma tylko jeden argument. –
Argumentem jest krotka, dzięki czemu można korzystać z funkcji, które manipulują krotki ... https://docs.python.org/2/c-api/tuple.html jak PyTuple_GetItem i PyTuple_Size Tu jest przykład powinno to pomóc: http://stackoverflow.com/questions/8001923/python-extension-module-with-variable-number-of-arguments – danielfranca
Dzięki, PyTuple_Size i PyTuple_GetItem były bardzo przydatne :) –