簡體   English   中英

使用SWIG從C向Python返回列表

[英]Return list using SWIG from C to Python

我具有以下要嘗試SWIG驗證的C函數:

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問題( 這個問題似乎很接近),也無濟於事。 我懷疑我應該在這里使用一個typemap,但是談到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;
}

這將允許您傳遞列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM