python - 使用 PyArg_ParseTuple 时第一个参数错误
问题描述
我为 ac 扩展类型编写方法:
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,要么默认为一个巨大的数字(取决于我调用方法 inpytest
或 using 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
。uint
像is 一样的 8 位vop
绝对是错误的大小,因为尝试将其写入就好像它是正常的一样unsigned int
可能会覆盖其他一些数据。Anpy_intp
可能是也可能不是正确的大小,但由于它可能是错误的,所以不要使用它。
对于您想要的第一个参数b
or B
,它是一个无符号字符(几乎每个平台上都有 8 位)。阅读文档以了解差异。对于第二个参数可能要使用K
for an unsigned long long
,传递给它 an unsigned long long
(应该足够大......),然后将其转换npy_intp
为自己检查溢出。或者,您可以使用O
then 调用PyLong_AsVoidPtr
它来获取 C 的号码。
顺便说一句:npy_uint8 vop = 0xdeadbeef;
应该可能会产生警告,因为该数字不适合 8 位。
推荐阅读
- webpack - webpack 或 babel-loader 在 node_modules 中找不到模块,这是 node_modules 中另一个模块所需要的
- javascript - Javascript中的函数和括号
- javascript - 在 | 之间选择字符串 带有和不带有符号本身的符号
- java - 打算在 android studio 上使用 kotlin 不起作用
- javascript - 如何获取服务器中的所有表情符号并让机器人在聊天中发送表情符号
- java - Gitlab API 下载文件 + RestTemplate
- c++ - 如何在 C++ 中创建模板化包装类
- python-3.x - AttributeError:响应内容不是文本。问题是什么?
- python - 如何在for循环中创建列表?
- python - 通过按钮单击调用类方法的不同方式