python与C++之间的参数传递_HeyMountain的博客-程序员宅基地

import sys
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
import numpy as np
import time
from ctypes import *
import os
import cv2
import ctypes
ll = ctypes.cdll.LoadLibrary
lib = ll("./build/libpython2share.so")

count = 0
gps_path="xxx.txt"#

with open(gps_path,'r') as f:
    all_latitude=[]
    all_longtitude=[]
    all_altitude=[]
    for row in f.readlines():
        row=row.split(' ')
        print(len(row))
        # print(row[2])
        # print(row[4])
        # print(row[6])
        all_latitude.append(row[2])
        all_longtitude.append(row[4])
        all_altitude.append(row[6])
print(len(all_latitude))
print(len(all_longtitude))
print(len(all_altitude))
while True:
    i = 0
    for i<len(all_latitude):
        value = lib.dump_(image.shape[0], image.shape[1], image_data,all_latitude[i],all_longtitude[i],all_altitude[i])
        i+=1

lib.dump函数原型为int dump(int row_image, int col_image, void* block_data_image,double lat,double lon,double alt)

问题描述:

在进行参数传递时,发现dump函数里的后三个实参都是0,问题原因在于python与c++之间的参数传递上

解决步骤

1.比较lib.dump函数内和函数前all_latitude[i],all_longtitude[i],all_altitude[i]三个量的值和类型

在函数之前,输出all_latitude[i],all_longtitude[i],all_altitude[i]的值正确,但是类型为str,因此需要格式从str转化为float(python无double数据类型)

 a=float(all_latitude[i])
 value = lib.dump_(image.shape[0], image.shape[1], image_data,a,b,c)
 #输出数据格式为float

将str类型转换为float类型后出现下面问题

Traceback (most recent call last):
  File "test_Send.py", line 91, in <module>
    value = lib.dump_(image.shape[0], image.shape[1], image_data,a,b,c)
ctypes.ArgumentError: argument 4: <class 'TypeError'>: Don't know how to convert parameter 4

2.ctypes.ArgumentError: argument 4: <class ‘TypeError’>: Don’t know how to convert parameter 4

原因是c里面用到单独的类型,需要将float转为c_float
因此

a=c_float(all_latitude[i])
b=c_float(all_longtitude[i])
c=c_float(all_altitude[i])
value = lib.dump_(image.shape[0], image.shape[1], image_data,a,b,c)

报错

Traceback (most recent call last):
  File "test_Send.py", line 71, in <module>
    a=c_float(all_latitude[i])
TypeError: a float is required

最终解决办法

转换数据格式
将str格式先转换为float再转化为c_float,即可成功

 a=float(all_latitude[i])
b=float(all_longtitude[i])
c=float(all_altitude[i])
d=c_float(a)
e=c_float(b)
f=c_float(c)
value = lib.dump_(image.shape[0], image.shape[1], image_data,d,e,f)

注意,float不能转化为c_double,否则值都会被初始化为0

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45617478/article/details/115400303

智能推荐

Timers and Time Management_ImNtJempty的博客-程序员宅基地

Timers and Time Management时间参数的传入对于内核而言是很重要的。相对于事件驱动的函数,内核当中还有一大部分事件驱动的函数存在。他们中的有些事周期性的,比如说调度器的runqueue、或者刷新屏幕。They occur on a fixed scheduler,比如说每秒钟100次。内核调度其他的函数,比如说在将来的某一刻延迟disk I/O。又比如说,内核会在500毫秒...

⟅UNIX网络编程⟆⦔TCP、UDP以及SCTP_o0o_-_的博客-程序员宅基地

缓冲区大小及限制IP数据报IPv4数据报最大大小为65535,包含40字节首部。IPv6数据报最大大小为65535+40。首部40字节,净载荷最大为65535。MTU(maximum transmission unit,最大传输单元)。IPv4要求的最小链路MTU为68字节,即20字节固定长度首部+最多40字节选项部分+最小8字节的数据。IPv6要求的最小链路MTU为1280字节...

Linux--命令大全--常用命令--历史/目录/文件/输出/权限/版本信息_IT利刃出鞘的博客-程序员宅基地

原文网址:简介 本文介绍Linux的一些常用命令。包括:查看历史命令、目录、文件、输出、权限、版本信息。history作用显示历史命令示例history 10 //显示最近10条命令 参数 含义 n 打印最近n条命令 -c 清空当前历史命令(缓冲区); ...

主流图片格式介绍_weiwei22844的博客-程序员宅基地

  主流图片格式介绍 收藏 现在的图片格式也多种多样。不过比较常用的格式就是那么几种,要知道到底是哪几种,只要打开WINDOWS自带的画图程序就知道了。”开始“--》”所有程序“--》”附件“--》”画图“。然后保存就会出现你要将文件保存为哪种格式的图片文件。包括:BMP(1bit,4bit,8bit,24bit),JPEG,GIF,TIF,PNG.    下面就介绍一下这些图片格式:常见图片

python 正则表达式 断言_Python 之 RE(正则表达式)常用_jck?????的博客-程序员宅基地

正则表达式基础提取字符串语法说明例可匹配字符串.匹配除了换行符”\n”以外的任意字符a.bacb、adb、a2b、a~b\转义,将转义字符后面的一个字符改变成原来的意思a[b\.\\]cabc、a.c、a\c[]匹配括号内的任意字符a[b,c,d,e]fabd、acf、adf、aef预定义字符语法说明例可匹配字符串^以说明字符串开始^123123abc、123321、123zxc$以说明字符串结尾...

Qt开发QGIS配置_浅眠&的博客-程序员宅基地_qgis qt开发

QT开发QGIS的配置与Visual Studio 2015开发QGIS的配置步骤相似。最大不同在于:Visual Studio 2015在设置中配置,QT在其pro文件中配置。Qt和QGIS安装见这里。1. 创建Qt项目根据自己的需求创建新Qt项目并运行生成exe文件。2. 修改pro文件将自己的pro文件改为如下内容,其中所有目录都需要根据自己的实际情况进行修改。# 增加xml和3dcore(3d显示)QT += core gui xml 3dcoregreaterThan

随便推点

详细讲解HTML 5中视频和音频核心事件_tianshizhimeng155的博客-程序员宅基地

【IT168 技术】HTML 5中的视频和音频中有不少核心的事件,其中有的比较容易理解,基本能从字面就解析了,比如“play”事件就很好理解。而其他有的事件则需要花费点心思,特别是“progress”事件。因此,在本文中,将带领读者研究HTML 5视频和音频中重要的事件,探究这些事件是应该在什么时候使用以及其中的重要相关属性。我们也将看下这些事件在当今不同浏览器中的差异。为了本文的测试,使用的浏览

最新!2022中国大学排名发布_3D视觉工坊的博客-程序员宅基地

来源|艾瑞深校友会网编辑 |学术君2022年1月25日,全国第三方大学评价机构艾瑞深校友会网(Cuaa.Net)正式发布《2022校友会中国大学排名—高考志愿填报指南》,连续第20年...

linux 驱动模块参考_wsk514460964的博客-程序员宅基地

#include #include #include #include #include #include #include #include #include #include #include #define GLOBALMEM_SIZE 0X1000  //全局内存大小#define MEM_CLEAR 0x1            //清

旧项目配置SVN与winSever服务器SVN钩子配置小记_懒得安分的博客-程序员宅基地

旧项目配置SVN与winSever服务器SVN钩子配置小记SVN是Subversion的简称,是一个开放源代码的版本控制系统,用于多个人共同开发同一个项目,共用资源的目的。昨天接手一个未配SVN的旧项目,应总工程师要求要配置SVN给同事共同开发,之前用的都已经是配置好的直接下载本地的SVN,所以第一次配置有一些问题和注意在此做个小记旧项目配置SVN与winSever服务器SVN钩子配置

python restful风格_让python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE等请求_LiuYanagi的博客-程序员宅基地

PS:经过调试和查找资料发现,OPTIONS是状态类型查询,即向服务器提交信息后不返回任何信息,只将执行状态(200状态)通知客户端,所以本文修改后对数据的返回不起作用,使用IE/火狐/谷歌三种浏览器测试时,发现IE上使用jquery ajax能支持delete与put正常提交,而其余两种都不行,所以想来想去,还是换一种方式提交,具体请看下一篇博文这两天在用python的bottle框架开发后台管...

NLP之TF-IDF学习_365JHWZGo的博客-程序员宅基地

'''Description: nlp之TF-IDF学习Autor: 365JHWZGoDate: 2021-11-16 14:48:45LastEditors: 365JHWZGoLastEditTime: 2021-11-16 18:27:02'''import numpy as npfrom collections import Counterimport itertoolsfrom visual import show_tfidfdocs = [ "Born on O