VS2010下opencv的C++程序未处理异常,出现内存访问冲突

肖承星 2015-12-15 10:55:55
这是我的函数代码
void load_data(double *T,IplImage *src,int k)  
{
int i,j;
//一副图像压缩成一维的,存在T的一列里
for (i=0;i<IMG_HEIGHT;i++)
{
for (j=0;j<IMG_WIDTH;j++)
{
T[(i*IMG_WIDTH+j)*TRAIN_NUM+k-1]= (double)(unsigned char)src->imageData[i*IMG_WIDTH+j];
}
}
}

在我主函数中
int _tmain(int argc, _TCHAR* argv[])  
{
double *T,*L,*m,*b,*q,*c,*p_q,*projected_train,*T_test,*projected_test,*eigenvector,*Euc_dist;
double eps,temp;
int i,j,flag,iteration,num_q;
char res[20];
IplImage *tmp_img,*test_img;

T = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*TRAIN_NUM); //原始数据
T_test = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*1); //测试数据
m = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH); //平均值
L = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM); //L=T'*T,协方差矩阵
b = (double *)malloc(sizeof(double)*TRAIN_NUM); //L的特征值
q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM); //L特征值对应的特征向量
c = (double *)malloc(sizeof(double)*TRAIN_NUM); //实对称三对角矩阵的次对角线元素

eps = 0.000001;
memset(L,0,sizeof(double)*TRAIN_NUM*TRAIN_NUM);

//存储图像数据到T矩阵
for (i=1;i<=TRAIN_NUM;i++)
{
sprintf(res,"C:\\Users\\lenovo\\Documents\\Visual Studio 2010\\Projects\\123\\Debug\\%d.jpg",i);
tmp_img = cvLoadImage(res,CV_LOAD_IMAGE_GRAYSCALE);
load_data(T,tmp_img,i);
}

我的程序在 运行到 load_data(T,tmp_img,i)的函数中
T[(i*IMG_WIDTH+j)*TRAIN_NUM+k-1]= (double)(unsigned char)src->imageData[i*IMG_WIDTH+j]; //此处中断发生问题

我的图片都是200*180大小的 ,设置IMG_HEIGHT 也200 IMG_WIDTH为180 ,TRAIN_NUM图片为20张


...全文
284 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
肖承星 2015-12-15
  • 打赏
  • 举报
回复
我新手小白,不懂这些啊。。。详细 点吧
赵4老师 2015-12-15
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
paschen 版主 2015-12-15
  • 打赏
  • 举报
回复
通过调用堆栈定位,通过变量窗口等观察分析原因
赵4老师 2015-12-15
  • 打赏
  • 举报
回复
char res[20]; sprintf(res,"C:\\Users\\lenovo\\Documents\\Visual Studio 2010\\Projects\\123\\Debug\\%d.jpg",i); 越界了。 改为 char res[256];
肖承星 2015-12-15
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
这是我调用的堆栈的结果啊,但是,还是看不懂啊,箭头指到第三行的时候,定位到了 mainret = wmain(argc, argv, envp); 一句 ( ,箭头指到第四行的时候,定位到了return __tmainCRTStartup();一句下面的 } 符号上面。箭头到第5行就显示没有可用源了。。。。自己搞不定啊

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧