关于使用vc++调用matlab生成的dll传递数组的问题

 网络上许多vc++调用matlab 的dll的方法使用的都是单值传递参数,但在许多情况下,我们并不能确定要传递的参数的大小,那么这个问题如何解决那?我想大家一定想到了使用指针和动态数组,是的,就是这样解决。
   第一步将你的matlab程序编译生dll,这个过程有许多的参考资料,这里我就不再赘述了。

   第二部贴一些实际的代码来个大家分析一下:

     我做的是一个求农业上的期望产量与趋势产量的实际应用,从1971年开始年序为1,作为x轴,产量作为y轴,使用曲线拟合出产量的趋势走向,虽然我的数值分析学的也很不错,但是为了减少开发成本,我还是使用了matlab作为开发次拟合曲线的饿工具,即快又准,与农业专家使用其他工具拟合的曲线十分接近(一公顷的误差在10公斤以下)。下面是一些具体的代码:

    yy=Fun_NX(1971,year);//获得用户给定年的年序,1971年开始为1
    double k=3;//上包络产量要求三次是三次拟合函数
   double *x=new double[m];//声明动态double数组x
 double *y=new double[m];//声明动态double数组y
 //进行内存拷贝,这里需要注意的是,我一开始使用的是首地址赋值的方式,虽然可以完成设计任务,但是在调试 //的时候发现内存泄露,delete无法很好地产出x,y变量
    memcpy(x,Fun_Year(1971,end_year,region),m*sizeof(double));//将获得的上包络年序数组头指针赋值给x
    memcpy(y,Fun_Yield(1971,end_year,region),m*sizeof(double));//将获得的上包络年序数组头指针赋值给y

  
 double result[4]={0,0,0,0};//用于记录三次曲线拟合的四个参数
 CString str;
 
 mxArray *b_x=mclGetUninitializedArray();//年,1971是为1每过一年加1,如1972年对应2
 mxArray *b_y=mclGetUninitializedArray();//该年产量
 mxArray *n=mclGetUninitializedArray();//线性拟合最高次,这里将k复制给n
 mxArray *p=mclGetUninitializedArray();//期望用p获得拟合函数mlfQxnh(b_x,b_y,n)的返回值
 
 mlfAssign(&b_x,mlfDoubleMatrix(1,m,x,NULL));//matlab与vc++混合编程将double类型的x数组转化为mxArray 类型的b_x,并赋值
 mlfAssign(&b_y,mlfDoubleMatrix(1,m,y,NULL));//matlab与vc++混合编程将double类型的y数组转化为mxArray 类型的b_y,并赋值
 mlfAssign(&n,mlfDoubleMatrix(1,1,&k,NULL));//matlab与vc++混合编程将double类型的k转化为mxArray 类型的n,并赋值

 //  将mlfQxnh(b_x,b_y,n)函数的返回值地址返回给指针p,此时的指针p为mxArray,我们无法在一般数据类型中使 //用,所以,还要将其赋值给一个常规的类型,我这里赋值给了double类型的指针pp
    mlfAssign(&p,mlfQxnh(b_x,b_y,n));

 //将mxArray类型p指针复制给指针pp
 double *pp=mxGetPr(p);
 

 //使用result获得返回值拟合曲线的系数,三次方的系数为:result[0],依次类推
    k=(int) k;//将k强制转换为整形
 for(i=0;i<=k;i++)
 result[i]=pp[i];//使用result[]记录pp[]的值

 //释放变量b_x,b_y,n,p,y,x
 mxDestroyArray(b_x);
 mxDestroyArray(b_y);
 mxDestroyArray(n);
 mxDestroyArray(p);
 delete y;
 delete x;

 //返回最终预测产量
 for(i=0;i<=k;i++)
  sum=sum+result[i]*pow(yy,k-i);
 return sum;

这样,就调用了一个dll返回的动态数组。

该文章转载自网络大本营:http://www.xrss.cn/Dev/C/200782516050.Html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章