【C#/C++】C#调C++的接口,给C++传结构体数组

C#调C++的接口,给C++传结构体数组

1、背景

C#软件创建了一个结构体数组用来存储图像的区域信息,分别是矩形框的左上像素的xy坐标和矩形框右下像素的xy坐标。需要传入给调用的C++函数的参数列表中,我们选择使用C#传入一个结构体数组指针的方式,C++的参数列表中也使用数组指针来接收这个变量。

2、实现

首先要保证C#和C++两边定义的结构体要完全一致。这里给出我在C++中的定义:

cpp 复制代码
struct MaskDataStruct
{
	int leftTop_X;
	int leftTop_Y;
	int rightDown_X;
	int rightDown_Y;
};

然后是C++函数接口的定义:

cpp 复制代码
CPPDLL_API int Detect(..., MaskDataStruct* MaskList, ...)
{
	...;
	MaskDataStruct MaskData;
	for(int ii = 0; ii < 4; ii++)
	{
		MaskDataStruct accept = *(MaskList + ii);
		MaskData.leftTop_X   = accept.leftTop_X;
		MaskData.leftTop_Y   = accept.leftTop_Y;
		MaskData.rightDown_X = accept.rightDown_X;
		MaskData.rightDown_Y = accept.rightDown_Y;
		
		int delta_h = MaskData.rightDown_Y - MaskData.leftTop_Y;
		int delta_w = MaskData.rightDown_X - MaskData.leftTop_X;

		cv::Rect no_roi1(MaskData.leftTop_X, MaskData.leftTop_Y, delta_w, delta_h);
		frame(no_roi1).setTo(cv::Scalar(0, 0, 0));
	}
	...;
}

c#中该结构体的定义:

csharp 复制代码
namespace CommonElement
{
    public class MaskDataStruct
    {
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct MaskData_Str
        {
            public int leftTop_X;//左上角X坐标
            public int leftTop_Y;//左上角Y坐标
            public int rightDown_X;//右下角X坐标
            public int rightDown_Y;//右下角Y坐标
        }
    }
}
相关推荐
Halo_tjn9 小时前
Java IO流文件操作
java·开发语言
吴可可1239 小时前
点在线上判定与多段线分割
算法·c#
折哥的程序人生 · 物流技术专研9 小时前
《Java 100 天进阶之路》第23篇:缓冲区数据结构 ByteBuffer
java·开发语言·数据结构·后端·面试·求职招聘
REDcker9 小时前
C++循环与编译器优化详解 别名不变量向量化与GCC Clang验证及perf实践
java·jvm·c++·c·clang·gcc
不剪发的Tony老师9 小时前
Code::Blocks:一款免费开源的C/C++/Fortran集成开发环境
c语言·c++·ide
咩咦9 小时前
C++学习笔记10:auto关键字
c++·学习笔记·c++11·auto·类型推导
lsx2024069 小时前
Razor VB 循环
开发语言
吴可可1239 小时前
圆弧多段线离散化采样密度优化
算法·c#
csuzhucong9 小时前
c++版本特性
开发语言·c++
wand codemonkey10 小时前
【第五步+前后分离调】最后的联动调试--java+Vue3项目
java·开发语言·vue.js