使用PyArg_ParseTup时第一个参数错误

2024-10-01 00:34:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我为c扩展类型编写方法:

static PyObject *
RawGraphState_apply_C_L(RawGraphState * self
                        , PyObject * args)
{
    npy_uint8 vop = 0xdeadbeef;
    npy_intp i;// = 0xdeadbeef;

    if(!PyArg_ParseTuple(args, "II", &i, &vop))
    {
        return NULL;
    }

    printf("i = %ld\n", i);

    if(vop >= 24)
    {
        PyErr_SetString(PyExc_ValueError, "vop index must be in [0, 23]");
        return NULL;
    }

    if(i >= self->length)
    {
        PyErr_SetString(PyExc_ValueError, "qbit index out of range");
        return NULL;
    }

    printf("mapping vop[%ld] %d,%d -> %d\n", i, vop, self->vops[i], vop_lookup_table[vop][self->vops[i]]);
    self->vops[i] = vop_lookup_table[vop][self->vops[i]];

    Py_RETURN_NONE;

}

但是,这无法正确读取第一个参数。它默认为0或一个巨大的数字(取决于我是在pytest中调用该方法还是使用ipython):

In [1]: from pyqcs.graph.backend.raw_state import RawGraphState                                                                        
^[[A
In [2]: g = RawGraphState(2)                                                                                                           

In [3]: g.apply_C_L(1, 0)                                                                                                              
i = 140200617443328
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-57081093fbb3> in <module>
----> 1 g.apply_C_L(1, 0)

ValueError: qbit index out of range

我做错了什么

--

您可以在此处找到代码:

https://github.com/daknuett/PyQCS/blob/graph_simulation/src/pyqcs/graph/backend/raw_state.c

从300号线开始


Tags: 方法inselfindexreturnifargsnull
1条回答
网友
1楼 · 发布于 2024-10-01 00:34:24

格式代码I需要传递一个指向unsigned int的指针。不是npy_uint8npy_intp。一个unsigned int并且只有一个unsigned int。一个8位的uintvop的大小肯定是错误的,因为试图像正常的unsigned int一样写入它可能会覆盖其他一些数据。一个npy_intp可能大小正确,也可能大小不正确,但因为它可能是错误的,所以不要使用它

对于第一个参数,您需要bB,这是一个无符号字符(几乎每个平台上都有8位)。阅读文档以了解差异。对于第二个参数,可能希望使用K作为unsigned long long,将unsigned long long(应该足够大…)传递给它,然后将其转换为npy_intp自己检查溢出。或者,您可以使用O然后调用^{}来获取C的号码

顺便说一句:npy_uint8 vop = 0xdeadbeef;可能会生成一个警告,因为这个数字不适合8位

相关问题 更多 >