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 :)
}
va_list? anh ta chỉ có một đối số. –
Đố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
Cảm ơn, PyTuple_Size và PyTuple_GetItem rất hữu ích :) –