我有ctypes奇怪的問題,因爲它似乎是通過取消引用應該不應該是指針損壞堆棧。與我保持一段時間,設置相當複雜。python ctypes堆棧損壞
我有一個C函數qfsm_search
與包裹簽名這樣的:
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指針segfault。
有沒有人有可能會發生什麼的想法?我懷疑它可能是qskel_ptr
類型的一些奇怪的問題,但這似乎不太可能,因爲我在傳遞NULL指針時解釋的行爲。
可能值得一提的是,我運行的是Windows 7 64位和Python 2.6.4。我也設法重現Python的行爲2.7.3
非常感謝
謝謝jsbueno,是的你對「5」是正確的,我通過改變它的值來檢查它。如果我可以進入Skel對象,看看能否找到任何線索,會更深一層。我不想規定它是ctypes或python中的一個bug,並且可能會嘗試更新python安裝,如果它沒有證明太困難(它包含在maya安裝中)。 –