У меня есть следующая функция C, которую я пытаюсь использовать SWIG-ify:
void GetAttOrder(int node, DCE_ORDER order, float att[3]);
который я хочу вызвать на Python и получить доступ через:
node = 0; order = DCD_TYPR;
attitude = GetAttOrder(node, order);
attitude[0] // 45.232
Где я ранее реализовал тип DCE_ORDER как
typedef enum
{
DCD_TPYR = 0,
DCD_TYPR,
DCD_TYRP,
...
DCD_PRYT
} DCE_ORDER;
Я нашел документацию по подобным проблемам в документации SWIG, но мне не удавалось реализовать решение. Я также рассмотрел некоторые другие проблемы с stackoverflow (этот кажется подозрительно закрытым), также безрезультатно. Я подозреваю, что я должен использовать типографию здесь, но я молод и глуп, когда дело доходит до SWIG.
Любые предложения или указатели?
Большое спасибо.
Завершилось решение этого через пару дней. Если у вас есть вектор, который вы хотите получить, вы можете сделать что-то вроде:
%typemap(in, numinputs=0) float vec3out[3] (float temp[3]) {
$1 = temp;
}
%typemap(argout) float vec3out[3] {
int i;
$result = PyList_New(3);
for (i = 0; i < 3; i++) {
PyObject *o = PyFloat_FromDouble((double) $1[i]);
PyList_SetItem($result,i,o);
}
}
А затем можно получить доступ к этой функции через Python, как я просил выше. Кроме того, если у вас есть другая функция, которую вы хотите передать в список (пара функций getter/setter), вы можете использовать следующий код:
%typemap(in) float vec3in[3] (float temp[3]) {
int i;
if (!PySequence_Check($input)) {
PyErr_SetString(PyExc_ValueError,"Expected a sequence");
return NULL;
}
if (PySequence_Length($input) != 3) {
PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected 3 elements");
return NULL;
}
for (i = 0; i < 3; i++) {
PyObject *o = PySequence_GetItem($input,i);
if (PyNumber_Check(o)) {
temp[i] = (float) PyFloat_AsDouble(o);
} else {
PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers");
return NULL;
}
}
$1 = temp;
}
который позволит вам пройти в списке.
float* GetAttOrder(int node, DCE_ORDER order)
перегрузкиfloat* GetAttOrder(int node, DCE_ORDER order)
который вызывает вашGetAttOrder
? Я считаю, что SWIG знает, как обрабатывать возврат указателя как список Python.