【问题标题】:Why does setting this member in C fail?为什么在 C 中设置这个成员会失败?
【发布时间】:2010-03-31 20:18:33
【问题描述】:

我正在为 C++ 库编写一个 Python 包装器,当我尝试在 C 中设置一个结构的字段时,我感到很奇怪。如果我有这样的结构: p>

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 代码可以正常工作,返回结构成员的值。对 SetBit 方法的调用给出了一个关于地址 foo 的对象访问地址 bar 的内存的错误,该错误不能被“写入”。

我浏览了代码,就好像我可以从 C 和 Python 中查看我想要的所有值,但是当我尝试设置它的那一刻,它在我面前炸开了锅。我在这里遗漏了一些基本的东西吗?

【问题讨论】:

    标签: python c


    【解决方案1】:

    传递 bool PyArg_ParseTuple 的地址是否可能会导致您的麻烦? "i" 格式会写一个 int 大小的东西。

    你在什么机器上运行?

    【讨论】:

    • 这是一台 Core2 Duo 笔记本电脑。我想,Python bools 应该是内部的整数。编辑:诸神。就是这样。我切换到一个int,突然它没有爆炸。什么地狱
    • @Lee:Python 布尔值可能是整数,但 C++ 不是 :-)(例如,它们是 Visual C++ 的字节)
    【解决方案2】:

    不应该是:

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

    【讨论】:

    • 嘎。是的,我在打字的时候搞砸了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多