在C中使用python的list对象,怎么进行操作?!试了N遍..怎么都弄不好,求各位大虾支支招!!

starviolet 2010-04-05 03:55:46
在 static PyObject *wrap_md(PyObject *self, PyObject *args) //PYTHON的C语言扩展模块

中定义了一个新的PyObject *, 而且是个LIST:

PyObject *xforce = PyList_New(TN); // int TN
//这里有一个问题,TN是从PYTHON读入的一个变量,可以这么定义吗?如果不行,怎么办?

然后,我就要对其进行操作了:

for (a = 0; a < TN;a++){
PyList_Insert(xforce, a, PyFloat_FromDouble(xForces(a)));}
//xForces()是之前定义的一个函数,返回double值。
//我想把它转换成 PyFloat 对象,可是就是不行!!结果只有 最后一个(即a=TN-1时)非零,其他的全是零。
//我也尝试过使用PyBuildValue(),结果一样跟上面一样。
//试过在Insert前增加计数 Py_INCREF(xforce),结果还是不对。

我验证了,设了一个 double test; test = xForces(i) // i为随便的一个int数,不循环,不插入List里,返回到Python是正确的。这说明我的xForces函数没有写错,返回的double值是正确的。。。

那问题就是出在这个PyList_Insert上。。试了N遍。。。什么增加计数,减少计数都不能。。(在FOR循环里,增加计数后,会变成全零,减少计数后无法运行,直接崩溃)

郁闷了。。。怎么也调试不出来。。。各位大虾帮我看看吧。。谢谢!!
...全文
364 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2010-04-06
  • 打赏
  • 举报
回复
觉得照1楼那里,py程序一旦遍历访问元素会挂掉才是...多上点代码看看是不是其他地方的问题。
starviolet 2010-04-06
  • 打赏
  • 举报
回复
angel_su,谢谢你!我现在已经完全弄好了!!谢谢!
starviolet 2010-04-06
  • 打赏
  • 举报
回复
啊...你是说,设置的那个临时变量在INSERT后, 它的计数要减少吧?这样才能释放它,对吗?
starviolet 2010-04-06
  • 打赏
  • 举报
回复
Py_BuildValue("d"...等换前一行写,用个变量记住,下行插入后计数就要减少...

SORRY...我不是特别明白这个意思. 是不是要加个Py_DECREF(xforce/yforce/zforce/xpos/ypos/zpos/xvelocity/yvelocity/zvelocity)这样的?

谢谢你!!我现在可以输出FORCE值了.是个很STUPID的错误...在PYTHON中的...
angel_su 2010-04-06
  • 打赏
  • 举报
回复
试了一下有数据呀。xpos = PyList_New(TN)等后6行没必要,参数paser后指针会赋新值,那么之前的新生对象就找不到了白占了空间。Py_BuildValue("d"...等换前一行写,用个变量记住,下行插入后计数就要减少...

print md_c.md(3, 1.0, 2.0,
[1.0,2.0,3.0],[4.0,2.0,1.0],[2.0,4.0,6.0],
[1.1,2.2,3.3], [1.4,3.5,3.2],[3.1,3.2, 4.1])

得到:
(78.037938569161668, -0.012061430838336079, 78.049999999999997, [2.100465102988788, 3.2018474779342081, 4.297687419077004, 1.0, 2.0, 3.0], [5.3990740354441407, 7.4986091422111461, 7.2023168223447129, 4.0, 2.0, 1.0], [5.1009302059775763, 5.203694955868416, 6.095374838154008, 2.0, 4.0, 6.0], [1.1047049683851307, 1.2536844307938115, 0.94161060082105796, 1.1000000000000001, 2.2000000000000002, 3.2999999999999998], [1.4060996700032273, 1.3504456327722558, 1.4434546972245166, 1.3999999999999999, 3.5, 3.2000000000000002], [3.1016755373417237, 3.2295971097787142, 2.9687273528795624, 3.1000000000000001, 3.2000000000000002, 4.0999999999999996], [0.0018604119551523779, 0.0073899117368312435, -0.009250323691983621], [-0.0037038582234350296, -0.0055634311554183177, 0.0092672893788533477], [0.0037208239103047559, 0.014779823473662487, -0.018500647383967242])
starviolet 2010-04-05
  • 打赏
  • 举报
回复
上面写错了一个地方,是 TN-1,一直都是TN-1个不停的循环,每组具有相同的值。。
我也不知道是哪里错了。。。。。。。。。。5555555555
starviolet 2010-04-05
  • 打赏
  • 举报
回复
设定0值 PyObject *xforce = PyList_New(0); 后出现的结果还是不对....

我应该是得到 TN个不同的值在LIST里面

改成零后,还是 前TN-1个全是0, 接下来的TN-1个又是一样的值,接下来的TN又都是一样的...
怎么回事..循环出了问题吗???

当LIST的长度初始化为TN后,修改成 PyList_SetItem(),就生成不了长度为TN的LIST了。。。

另 TN是在文件开头设置成全局变量了。因为在其它的计算函数中需要用到。
angel_su 2010-04-05
  • 打赏
  • 举报
回复
*xforce = PyList_New(TN)估计是这TN值的问题,非0一般紧接着多是用PyList_SetItem()设值。如果直接用PyList_Insert,先前长度应该设0,或者是一个已经存在的列表。

37,742

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧