2010-03-31 59 views
2

我正在寫一個C++庫Python包裝,而我得到一個試圖建立一個結構的領域。如果我有這樣一個結構,當真正奇怪:爲什麼在C中設置此成員失敗?

struct Thing 
{ 
    PyOBJECT_HEAD 
    unsigned int val; 
}; 

而且有兩個函數是這樣的:

static PyObject* Thing_GetBit(Thing* self, PyObject* args) 
{ 
    unsigned int mask; 

    if(!PyArg_ParseTuple(args, "I", &mask)) 
     Py_RETURN_FALSE; 

    if((self->val & mask) != 0) 
     Py_RETURN_TRUE; 

    Py_RETURN_FALSE; 
} 


static PyObject* Thing_SetBit(Thing* self, PyObject* args) 
{ 
    unsigned int mask; 
    bool on; 

    if(!PyArg_ParseTuple(args, "Ii", &mask, &on)) 
     Py_RETURN_FALSE; 

    if(on) 
     self->val |= mask; 
    else 
     self->val &= ~mask; 

    Py_RETURN_TRUE; 
} 

調用第一個方法的Python代碼工作正常,返回struct成員的值。調用SetBit方法給出的地址爲foo的對象的錯誤訪問存儲器地址,它不能被「寫入」。

我對代碼進行了探索,就像我可以從C和Python中看到所有我想要的值,但是當我試圖設置它的時候,它就在我的臉上。我在這裏錯過了什麼?

回答

3

是否有可能通過一個布爾PyArg_ParseTuple的地址是造成你的麻煩? 「我」格式將寫入一個int大小的東西。

你在跑什麼樣的機器?

+1

這是一款Core2 Duo筆記本電腦。我認爲,Python布爾應該是內部的整數。 編輯:葉神。就是這樣。我切換到一個int,並突然它不爆炸。我勒個去*。 – 2010-03-31 20:30:19

+1

@Lee:Python bools可能是整數,但C++不是:-)(例如,它們是Visual C++的字節) – 2010-03-31 20:35:40

+0

讓我感到尷尬。 – 2010-03-31 20:43:31

1

它不應該是:

if (on) 
    self->val |= mask; 
else 
    self->val &= ~mask; 
+1

Gah。是的,我把它敲出來搞砸了。 – 2010-03-31 20:24:53

相關問題