ctypes.ArgumentError: argument 2: type 'exceptions.TypeError': Don't know how to convert parameter

错误描述

我在用python的ctypes库调用c++的.so文件时候,出现了下面的错误:

ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: Don't know how to convert parameter 2

在这里插入图片描述
下面对我遇到这个问题时的情况做一下说明:
C++源文件中的函数需要传入的第二个参数是double型:

double a_mov(int ctrl, double pos_x, double pos_y){
	a._pos._x = pos_x;
	a._pos._y = pos_y;
	a._pos._x = op_pos_x;
	a._pos._y = op_pos_y;

	a0.cal_next_pos(b0._pos, des_pos, W_O, W_T, W_D, W_C, P_O, P_T, P_D, P_C);
	if(ctrl == 0)
		return a0._next_pos._x;
	else
		return a0._next_pos._y;
}

python程序:
在调用之前,我先用下面的程序(注释1处)将函数返回类型设置为c_double
并在(注释2处)将变量last_a_x,last_a_y设置为c_double类型,
运行结果是:只成功输出了一次,输出第二次时出现了错误
按理说,a_x变量(注释3处)的类型应该是c_double,但是我输出它的类型进行测试(注释4处)时发现,它的类型是float:
在这里插入图片描述
也即是说,(注释1处)的修改只是将函数的返回类型修改为了ctypes里的c_double,在python对应为float类型。(c、ctypes和python之间的对应关系详见参考资料【2】)

from ctypes import *
pos = CDLL('./angleStreategy.so')
pos.init()

a_mov = pos.a_mov
a_mov.restype = c_double  #----------1

last_a_x = c_double(0.0)
last_a_y = c_double(0.0) #----------2

for i in range(0,10):
	a_x = pos.a_mov(0,last_a_x,last_a_y)
	a_y = pos.a_mov(1,last_a_x,last_a_y) #----------3
	print(type(a_x)) #-----------4
	last_a_x = a_x
	last_a_y = a_y #----------5
	print(a_x)
	print(a_y)

解决方法

将(注释5处)修改为

last_a_x = c_double(a_x)
last_a_y = c_double(a_y)

问题解决!
(问题比较特殊,所以说的比较详细,这样才有参考价值
参考资料:

【1】python调用c/c++代码以及解决ctypes.ArgumentError: argument 1: class ‘TypeError’: Don’t know how to convert
【2】python中运用ctypes库实现c风格变量的定义和调用

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值