我在 ctypes 方面遇到了奇怪的问题,它似乎通过在不应该的情况下取消引用指针来破坏堆栈。待我一会儿,设置相当复杂。
我有一个qfsm_search
带有包装签名的 C 函数,如下所示:
qmotion.qfsm_search.argtypes = [
qfsm_ptr,
qfsm_node_t,
qskel_ptr,
vec3, c_int,
qfsm_node_ptr,
POINTER(c_int)]
qmotion.qfsm_search.restype = None
然后我输出参数的所有详细信息并在 python 中调用它,如下所示:
print("Fsm: %d | %X" % (sizeof(fsm), addressof(fsm.contents)))
print("Curr: %d | %d %d %d" % (sizeof(curr), curr.state, curr.anim, curr.frame))
print("Skel: %d | %X" % (sizeof(skel), addressof(skel.contents)))
print("Tar: %f %f %f" % (tar.x, tar.y, tar.z))
print("Limit: %i" % limit)
print("Out: %X" % addressof(out_nodes_p.contents))
print("Out Num: %X" % addressof(out_num_p.contents))
qmotion.qfsm_search(fsm, curr, skel, tar, limit, out_nodes_p, out_num_p)
这会在 python 端输出以下内容。到目前为止,一切似乎都很好。
Fsm: 8 | 13CF0960
Curr: 12 | 0 0 89
Skel: 8 | 49193E60
Tar: 100.000000 100.000000 100.000000
Limit: 5
Out: 39A4FD10
Out Num: 2D623510
然后在 CI 中有这样的功能:
void qfsm_search(qfsm_t* fsm, qfsm_node_t curr, qskel_t* skel, vec3 tar, int max_out, qfsm_node_t* out, int* out_num) {
qdebug("Fsm: %d | %p", (int)sizeof(fsm), fsm);
qdebug("Node: %d | %d %d %d", (int)sizeof(curr), curr.state, curr.anim, curr.frame);
qdebug("Skel: %d | %p", (int)sizeof(skel), skel);
qdebug("Tar: %f %f %f", tar.x, tar.y, tar.z);
qdebug("Max: %d", max_out);
qdebug("Out: %p", out);
qdebug("Out Num: %p", out_num);
....
但是这个函数输出:
Fsm: 8 | 0000000013CF0960
Node: 12 | 0 0 89
Skel: 8 | 000000000D6281A8
Tar: 0.000000 0.000000 14144512.000000
Max: 967112848
Out: 000000000D628468
Out Num: 0000000000000005
请注意参数的值是如何skel
变化的,以及它损坏后的堆栈。我认为 ctypes 取消引用skel
参数的原因是,如果我设置skel
为 NULL 指针,那么在输入 C 函数并打印任何调试信息之前,我会得到一个 NULL 指针段错误。
有谁知道可能会发生什么?我怀疑这可能是 type 的一些奇怪问题qskel_ptr
,但这似乎不太可能,因为我在传递 NULL 指针时解释的行为。
值得一提的是,我正在运行 Windows 7 64 位和 Python 2.6.4。我还设法重现了 Python 2.7.3 上的行为
非常感谢