2009-11-23 84 views
0

在此代碼中遇到一些麻煩。試圖從C++模塊中返回一個元組(元素)的元組。看起來對我而言,dirty列表包含兩個Coord s,所以len是2,列表中的項目的xy值分別是0,00,1。第一次我試圖這樣做,所以我很可能誤解了文檔或其他東西。任何提示?在C++模塊崩潰時創建PyTuple

PyObject* getDirty() 
{ 
    int len = dirty.size(); 
    PyObject* tuple = PyTuple_New(len); 
    int count = 0; 
    for (std::list<Coord>::iterator i = dirty.begin(); i != dirty.end(); ++i) 
    { 
     PyTuple_SET_ITEM(tuple, count, PyTuple_Pack(2, (*i).x, (*i).y)); 
     ++count; 
    } 
    return tuple; 
} 

編輯:哦,忘了提,實際的崩潰是在PyTuple_Set_ITEM線。

+0

使用'i-> x'而不是'(* i).x'。 – 2009-11-23 21:35:43

+0

明白了,看起來更好......但是還有其他原因嗎? – Mizipzor 2009-11-23 21:42:57

+0

沒有其他原因'i-> x'。 – 2009-11-24 12:08:26

回答

1

指向PyTuple_Pack的參數在第一個之後必須是PyObject指針。

有可能要用

Py_BuildValue("(ii)", (*i).x, (*i).y) 

...假設座標實際上int類型。

+0

是的,剛剛通過一些瘋狂的實驗發現了這一點。雖然,我用格式字符串「(i,i)」來做是錯的嗎?而且,順便說一句,你不知道區別? PyTuple_Pack似乎返回一個PyObject *(已創建),所以我不知道爲什麼沒有工作。 – Mizipzor 2009-11-23 21:34:43

+0

http://python.org/doc/2.5.2/ext/buildValue.html – u0b34a0f6ae 2009-11-24 12:01:05

+0

Py_BuildValue和PyTuple_Pack之間的相關區別在於Py_BuildValue會將每個單獨的值轉換爲一個'PyObject *'給你,而PyTuple_Pack期望它的每個值參數已經是一個'PyObject *'。 – 2009-11-24 12:07:47