2014-08-28 13 views
5

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 :) 
    } 

Odpowiedz

2

Zastosowanie PyArg_VaParse: https://docs.python.org/2/c-api/arg.html#PyArg_VaParse Współpracuje z va_list, gdzie można odzyskać zmienną liczbę argumentów.

Więcej informacji tutaj: http://www.cplusplus.com/reference/cstdarg/va_list/

A jak to jest krotka można korzystać z funkcji krotka: https://docs.python.org/2/c-api/tuple.html jak PyTuple_Size i PyTuple_GetItem

Oto tam jest przykładem tego, jak z niego korzystać: Python extension module with variable number of arguments

Let wiem, czy to ci pomoże.

+0

va_list? ma tylko jeden argument. –

+0

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

+0

Dzięki, PyTuple_Size i PyTuple_GetItem były bardzo przydatne :) –

0

Nie wiem, czy to jest to, czego szukasz, ale można napisać funkcja C, która pobiera zmienną liczbę argumentów, używając va_list i va_start. Tutorial jest tutaj: http://www.cprogramming.com/tutorial/c/lesson17.html

+0

z instrukcji: "Funkcja C zawsze ma dwa argumenty, konwencjonalnie o nazwie self i args." –