C#与C++编写的dll调用——double数组/一维/二维

C#与C++编写的dll调用——double数组/一维/二维

传入参数 C++:double *——C#:double[]

————————一维数组——————
先来个 一维的数组,
C++代码块:

//.cpp
//将传入的数组所有值增加1后返回
_declspec(dllexport) void test_double_group(double *test, int num)
{
	int j = 1;
	for (int i = 0; i <num; i++)
	{
		test[i] += 1;
	}
}
//.h
extern "C" _declspec(dllexport) void test_double_group(double *test, int num);

C#代码块

class DLLImportHelper
{
    [DllImport("SWAP_DLL.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern void test_double_group(double[] test,int num);
}
//main
double[] test = { 1, 2, 3 };
DLLImportHelper.test_double_group(test,3);
 for (int i = 0; i < test.Count(); i++)
 {
     MessageBox.Show(test[i].ToString());
 }

运行 ,result:
2,3,4;
————————以上为一维数组——————

传入参数 C++:double **——C#:double[,]

再来二维数组的传递方式:
C++代码:

//.cpp
_declspec(dllexport) void test_double_2groups(double **test, int num)
{
	double x = 1;
	for (int i = 0; i <num; i++)
	{
		for (int j = 0; j < num; j++)
			test[i][j] = x++;
	}
}
//.h
extern "C" _declspec(dllexport) void test_double_2groups(double **test, int num);

该程序的方式,是采用C#编写辅助函数,在辅助函数中定义指针数组,再调用dll相应方法,传入数组,该指针数组存放的是二维数组的每一行的首元素的指针地址,C#中对函数的声明以及辅助函数的定义如下:

//==================动态库调用和辅助函数==========================
//double*[]为指针数组,存放二维数组表格数据类型的每一行row的首元素的地址;
[DllImport("SWAP_DLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern unsafe void test_double_2groups(double*[] matrix,int num);
//辅助函数定义
public static void Assist_test_double_2groups(double[,] myArray,int num)
{
   //获取行维度
   int row = myArray.GetUpperBound(0) + 1;
   //获取列维度
   int col = myArray.GetUpperBound(1) + 1;
   unsafe
   {
       //fp是myArray[0][0]的地址,是整个二维数组的地址,
       //也是二维数组第一行第0个元素的地址,
       fixed (double* fp = myArray)
       {
           //定义指针数组的数组名及维度
           double*[] farr = new double*[row];
           //遍历,把每一行开始的地址,存入指针数组中
           for (int i = 0; i < row; i++)
           {
               farr[i] = fp + i * col;
           }
           //调用dll中对应的函数
           test_double_2groups(farr, num);
       }
   }
 }

//=============================使用代码==========================

double[,] matrix = new double[N,N] ;
DLLImportHelper.Assist_test_double_2groups(matrix,N);
MessageBox.Show(matrix[99,99].ToString());

以上代码需要注意的几个点:
首先,在C#中对指针的操作,需要加关键字unsafe;
其次,unsafe添加完后,需要在“项目——属性设置——生成”中,允许不安全代码前打√,这样才能发运行辅助函数的主体函数,否则unsafe段程序运行会报错。
这些操作完毕后,就可以在主函数中调用自己构造的辅助系列函数了,当然,辅助函数可以根据个人需要,更改返回类型,不太建议把一个模块函数弄的太复杂,这样容易弄错,宁可多分几个模块;

这些代码没有删减,直接拷贝后可以直接运行。结果是弹出窗口 显示10000

原C++代码的意思是,将N*N的元素按照从上到下,从左至右,对每个元素从1开始赋值,本案例用的matrix数组是100×100的,所以赋值区间为1~10000,messagebox输出的是第99行第99列,即最后一个元素,故为10000.
————————————————
版权声明:本文为CSDN博主「宿大人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41692285/article/details/103870884

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值