我为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号线开始
格式代码
I
需要传递一个指向unsigned int
的指针。不是npy_uint8
或npy_intp
。一个unsigned int
并且只有一个unsigned int
。一个8位的uint
类vop
的大小肯定是错误的,因为试图像正常的unsigned int
一样写入它可能会覆盖其他一些数据。一个npy_intp
可能大小正确,也可能大小不正确,但因为它可能是错误的,所以不要使用它对于第一个参数,您需要} 来获取C的号码
b
或B
,这是一个无符号字符(几乎每个平台上都有8位)。阅读文档以了解差异。对于第二个参数,可能希望使用K
作为unsigned long long
,将unsigned long long
(应该足够大…)传递给它,然后将其转换为npy_intp
自己检查溢出。或者,您可以使用O
然后调用^{顺便说一句:
npy_uint8 vop = 0xdeadbeef;
可能会生成一个警告,因为这个数字不适合8位相关问题 更多 >
编程相关推荐