2014-08-28 12 views
5

Tôi đang viết hàm C nhận hàm Python tuple của ints làm đối số.Tuple Python vào mảng C

static PyObject* lcs(PyObject* self, PyObject *args) { 
    int *data; 
    if (!PyArg_ParseTuple(args, "(iii)", &data)) { 
     .... 
    } 
} 

tôi có thể chuyển đổi một tuple của một chiều dài cố định (ở đây 3) nhưng làm thế nào để có được một C array từ một tuple dù ngắn hay dài?

import lcs 
lcs.lcs((1,2,3,4,5,6)) #<- C should receive it as {1,2,3,4,5,6} 

EDIT

Thay vì một tuple tôi có thể vượt qua một chuỗi với số cách nhau bằng ';'. Ví dụ: '1; 2; 3; 4; 5; 6' và tách chúng thành mảng trong mã C. Nhưng tôi không nghĩ rằng đó là một cách thích hợp để làm điều đó.

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 (SOLUTION)

Tôi nghĩ rằng tôi đã tìm thấy một giải pháp:

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

Trả lời

2

Sử dụng PyArg_VaParse: https://docs.python.org/2/c-api/arg.html#PyArg_VaParse Nó hoạt động với va_list, nơi bạn có thể lấy một số biến của tham số.

Thông tin thêm ở đây: http://www.cplusplus.com/reference/cstdarg/va_list/

Và vì nó là một tuple bạn có thể sử dụng các chức năng tuple: https://docs.python.org/2/c-api/tuple.html như PyTuple_Size và PyTuple_GetItem

Dưới đây là có một ví dụ về cách sử dụng nó: Python extension module with variable number of arguments

Lết tôi biết nếu nó giúp bạn.

+0

va_list? anh ta chỉ có một đối số. –

+0

Đối số là một bộ dữ liệu, vì vậy bạn có thể sử dụng các hàm điều khiển bộ dữ liệu ... https://docs.python.org/2/c-api/tuple.html như PyTuple_GetItem và PyTuple_Size Đây là một ví dụ điều đó sẽ giúp: http://stackoverflow.com/questions/8001923/python-extension-module-with-variable-number-of-arguments – danielfranca

+0

Cảm ơn, PyTuple_Size và PyTuple_GetItem rất hữu ích :) –

0

Không chắc nếu đây là những gì bạn đang tìm kiếm, nhưng bạn có thể viết một hàm C nhận một số lượng các đối số, sử dụng va_list và va_start. Một hướng dẫn ở đây: http://www.cprogramming.com/tutorial/c/lesson17.html

+0

từ hướng dẫn sử dụng: "Hàm C luôn có hai đối số, thường được đặt tên là tự và arg." –

Các vấn đề liên quan