2014-04-29 87 views
1

返回列表我有我想痛飲,IFY下面的C函數:使用痛飲從C到Python的

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 documentation,但我沒有任何運氣實施解決方案。我也看了一些其他的stackoverflow問題(this one似乎很可疑),也無濟於事。我懷疑我應該在這裏使用一個類型圖,但在SWIG方面,我很年輕和愚蠢。

任何建議或指針?

非常感謝。

+0

你有沒有試過創建一個重載'float * GetAttOrder(int node,DCE_ORDER order)'哪個調用你的'GetAttOrder'?我相信SWIG知道如何將指針返回視爲Python列表。 – Schollii

+0

不,我沒有嘗試過,但我最終得到了一些工作。我會繼續回答自己。 –

回答

1

幾天後終於解決了這個問題。如果你有一個你想離開的向量,你可以做這樣的事情:

%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; 
} 

這將允許您在列表中通過。