我使用 Matlab 编码器从 Mathlab .m 文件创建了一个 dll 文件。在matlab中,matlab代码运行良好,没有任何错误,DLL创建成功。MV2010 编译并运行良好。但是,当软件在 Visual Studio 中从此 DLL 调用任何函数时,我会在内存位置得到“未处理的异常”,在另一个内存位置得到“访问冲突读取位置”。
我认为创建的 dll 取决于另一个丢失的 dll。所以,我使用依赖 Walker 来检查依赖。但是,依赖遍历器没有显示任何缺失的依赖。
Matlab 函数接受 5 个输入变量(四个作为双精度,一个作为一维双精度数组)并返回 4 个双精度值。所以我认为这可能是我传递给matlab生成的代码的数组的大小很小。所以,我重新调整了数组的大小。原始大小是 750,而新大小是 5000。仍然得到相同的未处理异常。
知道如何调试这个未处理的异常吗?还有什么我需要检查的吗?
/* 函数声明 */
extern void mat3(double ValueF, double DesiredValue, double io, double del, emxArray_real_T *a, double *status, double *slope_deg, double *fval, double *SVal);
我在 MS2010 中调用此方法,如下所示。
double lValueF = 166.6;
double lDesiredValue = 42.00;
double io = 1.0;
double del = 4.0;
emxArray_real_T *lInputRoi;
// a = emxCreate_real_T(height,width);
lInputRoi = emxCreate_real_T(size_y,size_x);
// Converting 2D image to ID array
if(!isHorz)
{
int lRow = 0;
int lCol = 0;
for (int row=roi.y+odd_y_offset;row< roi.y+size_y;row=row+2)
{
lCol = 0;
for (int col=roi.x;col< roi.x+size_x;col++)
{
lInputRoi->data[lRow *size_x + lCol] = (real_T)img.at<uchar>(row,col);
lCol++;
}
lRow++;
}
}
else
{
int lRow = 0;
int lCol = 0;
for (int col=roi.x+odd_x_offset;col< roi.x+size_x;col=col+2)
{
lRow = 0;
for (int row=roi.y;row< roi.y+size_y;row++)
{
lInputRoi->data[lCol *size_y + lRow] = (real_T)img.at<uchar>(row,col);
lRow++;
}
lCol++;
size_x = roi.height;
size_y = roi.width;
}
}
// initializing matlab generated function
mat3_initialize();
double lStatus = 0;
double lslope_deg = 0.0;
double lfreqval = 0.0;
double lsfrvalue = 0.0;
mat3(lValueF, lDesiredValue, io, del, lInputRoi, &lStatus, &lslope_deg, &lfreqval, &lsfrvalue);
注意:1)img -> 是输入图像数据。2) roi -> 是一个结构类型的对象,它有两个 int 变量(x 和 y) 3) MV2010 应用程序是一个使用“共享 DLL 中的 MFC”的应用程序 4) 我看过一个关于如何集成 Mathlab 的教程在 Microsoft Visual Studio 中生成 dll。但是,本教程没有出现任何错误。http://www.mathworks.com/videos/integrate-code-into-visual-studio-77402.html
感谢您提前提供任何帮助。