python - 为什么在C中设置该成员失败?

标签 python c

我正在为 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 中查看我想要的所有值,但是当我尝试设置它时,它就在我面前爆炸了。我在这里错过了一些基本的东西吗?

最佳答案

传递 bool PyArg_ParseTuple 的地址是否可能给您带来麻烦? “i”格式将写入一个 int 大小的东西。

您在什么类型的机器上运行?

关于python - 为什么在C中设置该成员失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2556172/

相关文章:

python - 使用 Python >= 2.7 将嵌套的 namedtuple 序列化为 JSON

在 C 中创建位置链接列表

python - Python 中点画派绘画的随机化算法

c - 从文件中读取一行并将其存储在变量中

c++ - 如何使用带通配符的 ltrace

c - 这些使我的程序停止运行的 for 循环出了什么问题?

c++ - Qt/embedded 中的手动事件处理(不使用 QApplication :exec() )

python - Notepad++ 正则表达式每隔一个字符位置插入随机字母或数字

python - 如何突出显示箱线图中的某些记录

python - 查看仅当前用户对象的列表,Django REST