当前位置:网站首页 > C++编程 > 正文

pcl头文件(头文件cctype)



因为实验室图像处理的算法都是在OpenCV下写的,还有就是导航的算法也是用C++写的,然后界面部分要求在C#下写,所以不管是Socket通信,还是调用OpenCV的DLL模块,都设计到了C#和C++数据类型的对应,还有结构体的封装使用。在夸语言调用方面,Java和C#都只能调用C格式导出的动态库,因为C数据类型比较单一,容易映射,两者都是在本地端提供一套与之映射的C#或者Java的描述接口,通过底层处理这种映射关系达到调用的目的。

一. 结构体的传递

  在C#下对应的结构体定义:

  可以通过两种方式来调用非托管的函数SetVersionPtr:

1. 方式一(传入结构体引用),在C#中,结构体是以传值的方式传递的,类才是一传地址的方式传递的,加上关键字ref就可以了。C端传递了两种不同类型的参数,都可以通过引用来解决

  2. 方式二(传入IntPtr(平台通用指针))

对应的函数在C#中的声明:

    测试代码:

  上面的两种方法得区别是:

第一种方法是先创建一个等价的结构体,然后把这个结构体的引用传递给DLL中的接口函数。第二种方法是申请一块结构体大小的非托管内存,然后向内存中写入数据。调用的时候,只把这块非托管的内存的指针传递给DLL中的接口函数。其实第二种方法可以不用事先定义结构体,只需要知道结构体的大小,申请相应的非托管内存就可以了。

二.结构体数组的传递

DLL中非托管代码:

调用代码接口:

测试代码:

  上面的代码中有两处需要说明一下:

(1)C#中的IntPtr指针做相应的运算的时候,要首先把IntPtr做相应的转换,然后运算。运算结束之后还要再做相应的转换,还原成原来的IntPtr。

(2)Marshal.Copy这个函数的功能是:将数据从托管数组复制到非托管内存指针,或从非托管内存指针复制到托管数组。

三. 复杂结构体的传递

1. 输出参数,结构体作为指针传出

非托管部分代码:

  上面DLL 的导出函数要求传递的参数为它自定义的Class结构体数组, 那么我们在C#调用它时也要自定义对应的结构体了,

我们可以定义为如下:

  需要注意的是,这2个结构体中的数组大小一定要跟C++中的限定一样大小哦,接下来如何使用这个API来正确的获取数据呢,大多数人可能想到像这样的处理方式:

  没错,这样的处理是没问题的,但是我们的API的参数是Class数组,这种处理方式只是传递一个Class结构体参数,所以这种方式在这里就不太合适了,!

那大家就想到先Class[] myclass = new Class[MaxClass]; 然后在用Marshal.AllocHGlobal 来获取myclass 数据的指针,

其实这样也是错的, 因为 Class结构中包含了,不能直接封送的Student结构,所以无论如何上面的想法是错误的!

那要怎么办呢,其实很简单,就是先分配一段非托管内存,并调用API后,再将非托管内容数据读取到托管结构体数据中!

示例演示代码如下:

到此这篇pcl头文件(头文件cctype)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • cpx1500(cpx1500功放机)2026-03-03 21:54:05
  • 越狱源安装(越狱源安装不上appsync)2026-03-03 21:54:05
  • console线(console接口是干嘛的)2026-03-03 21:54:05
  • Xmouse下载(mouse2joystick下载)2026-03-03 21:54:05
  • 找不到msvcp140 dll(找不到msvcp110.dll是什么意思)2026-03-03 21:54:05
  • apc和upc区别图片(upc与ean)2026-03-03 21:54:05
  • cns15285认证(cns2396认证)2026-03-03 21:54:05
  • msvcp100.dll无法继续执行代码(mfc100u.dll无法继续执行代码)2026-03-03 21:54:05
  • ceph 存储池(ceph 存储池忙 use by cephfs)2026-03-03 21:54:05
  • gmock使用案例(gmock原理)2026-03-03 21:54:05
  • 全屏图片