,“启动调试”和“开始执行(不调试)”的结果不一样是怎么回事呢?

时间:2022-11-24 23:04:48
一般情况下,没有断点的话“启动调试”和“开始执行(不调试)”的结果是一样的。可是我碰到一种情况,在没有断点的情况下,不管是debug还是release版本,“启动调试”和“开始执行(不调试)”的结果不一样是怎么回事呢?希望有大侠出来指点指点!

12 个解决方案

#1


“启动调试”和“开始执行(不调试)”的结果不一样

确定一下 你看的结果 是最后结果 不是中间结果

#2


“启动调试”和“开始执行(不调试)”会不一样,
但是不会导致最终结果不一样的。

#3


引用 1 楼 hmily821023 的回复:
“启动调试”和“开始执行(不调试)”的结果不一样

确定一下 你看的结果 是最后结果 不是中间结果


我做视频处理的,每处理完一帧我就把其结果用fprintf写到一个.dat文件中,用“开始执行”总是会出现大量的“-1.#QNAN0”,但是同一个版本,用“启动调试”就没有出现结果“-1.#QNAN0”,调试进去看结果都是对的

#4


一个是走你打的断点,一个直接运行

#5


那就OK了
可能是启动调试  需要些中间数据吧  .net处理过  干啥用得 咱就不知道了

#6


学习了。。。。

#7


程序源代码如下,希望各位指点:
        //计算光流保存到向量velocityFieldX,velocityFieldY:std::vector<float> 类型
        GetOpticalFlowFieldMask(mask,newObjRect,m_curFrame,m_nextFrame,velocityFieldX,velocityFieldY);


        //下面是把向量中的值写到dat文件
FILE* testFile;
char buffer1[65];
CString fileName;
_itoa((int)m_curFrameNum,buffer1,10);
char buffer2[65];
_itoa((int)(trackTemplate.poID),buffer2,10);
CString str = "logP";
fileName = m_resultPath + "\\" + "obj" + buffer2 + "velX" + buffer1 + ".dat";
testFile = fopen(fileName,"w");
for (int i = 0; i < velocityFieldX.size(); i++)
{
//CString str;
//str.Format("the current velocity is: %f",velocityFieldX[i]);
//AfxMessageBox(str);

//AfxMessageBox("reach this place");
//float temp = velocityFieldX[i];
//if (temp<-10000000000 || temp>10000000000)
//{
// AfxMessageBox("exist NAN");
//}
//fprintf(testFile,"%f\n",velocityFieldX[i]);
}
fclose(testFile);

      //在release版本下或者debug版本下,用“启动调试”和“开始执行(不调试)”结果不一样,“开始执行”的结果会出现很多的-1.#QANA0


GetOpticalFlowFieldMasik函数如下:

void GetOpticalFlowFieldMask(std::vector<int> &curMask,CRect &matchRange, IplImage * curImage, IplImage *nextFrame, vector<float> &velocityFieldX, vector<float> &velocityFieldY)
{
velocityFieldX.clear();
velocityFieldY.clear();
int nWidth = curImage->width;
int nHeight = curImage->height;
IplImage * curGrayImage = cvCreateImage(cvSize(curImage->width, curImage->height), IPL_DEPTH_8U, 1);
IplImage * nextGrayImage = cvCreateImage(cvSize(curImage->width, curImage->height), IPL_DEPTH_8U, 1);
IplImage * curGrayRect = cvCreateImage(cvSize(matchRange.Width()+1, matchRange.Height()+1), IPL_DEPTH_8U, 1);
IplImage * nextGrayRect = cvCreateImage(cvSize(matchRange.Width()+1, matchRange.Height()+1), IPL_DEPTH_8U, 1);
IplImage * velocityX = cvCreateImage(cvSize(matchRange.Width()+1, matchRange.Height()+1), IPL_DEPTH_32F, 1);
IplImage * velocityY = cvCreateImage(cvSize(matchRange.Width()+1, matchRange.Height()+1), IPL_DEPTH_32F, 1);
cvCopy(curImage,curGrayImage,NULL);
cvCopy(nextFrame,nextGrayImage,NULL);

curGrayImage->origin = 1;
nextGrayImage->origin = 1;
curGrayRect->origin = 1;
nextGrayRect->origin = 1;
velocityX->origin = 1;
velocityY->origin = 1;

for (int i = 0;i <= matchRange.Width();i++)
{
for (int j = 0;j <= matchRange.Height();j++)
{
int x = i + matchRange.left;
int y = j + matchRange.top;
if ( x >= 0 && x < curGrayImage->width && y >= 0 && y< curGrayImage->height)
{
*(curGrayRect->imageData + j * curGrayRect->widthStep + i) = *(curGrayImage->imageData + y * curGrayImage->widthStep + x);
*(nextGrayRect->imageData + j * nextGrayRect->widthStep + i) = *(nextGrayImage->imageData + y * nextGrayImage->widthStep + x);
}
}
}

//【L-K】
//cvCalcOpticalFlowLK(curGrayRect,nextGrayRect,cvSize(1,1),velocityX, velocityY);

//【H-S】
CvTermCriteria criteria;
criteria.epsilon = 0.1;
criteria.max_iter = 20;
criteria.type = CV_TERMCRIT_EPS;
cvCalcOpticalFlowHS(curGrayRect,nextGrayRect,3, velocityX, velocityY, 0.5, criteria);

//【Block Match】
//cvCalcOpticalFlowBM(curGrayRect,nextGrayRect,cvSize(5, 5), cvSize(1, 1), cvSize(10, 10), 1, velocityX, velocityY);

velocityFieldX.clear();
velocityFieldY.clear();
velocityFieldX.resize((matchRange.Width()+1) * (matchRange.Height()+1), 0);
velocityFieldY.resize((matchRange.Width()+1) * (matchRange.Height()+1), 0);

for(int i = 0;i <= matchRange.Width();i++)
{
for(int j = 0;j <= matchRange.Height();j++)
{
float Value = 0.0; 
int ii = i + matchRange.left;
int jj = j + matchRange.top;
if (curMask[ii+jj*m_imageWidth] == 0) 
{
Value = 0;
velocityFieldX[j * (matchRange.Width()+1) + i] = Value;
velocityFieldY[j * (matchRange.Width()+1) + i] = Value;
}
else
{
Value = ((float*)(velocityX->imageData + j * velocityX->widthStep))[i];
velocityFieldX[j * (matchRange.Width()+1) + i] = Value;
Value = ((float*)(velocityY->imageData + j * velocityY->widthStep))[i];
velocityFieldY[j * (matchRange.Width()+1) + i] = Value;
}
}
}

cvReleaseImage(&curGrayImage);
cvReleaseImage(&nextGrayImage);
cvReleaseImage(&curGrayRect);
cvReleaseImage(&nextGrayRect);
cvReleaseImage(&velocityX);
cvReleaseImage(&velocityY);
}
引用楼主 jiangliangwei 的回复:
一般情况下,没有断点的话“启动调试”和“开始执行(不调试)”的结果是一样的。可是我碰到一种情况,在没有断点的情况下,不管是debug还是release版本,“启动调试”和“开始执行(不调试)”的结果不一样是怎么回事呢?希望有大侠出来指点指点!

#8


难道是人品问题

#9


我现在也是这个问题  楼主有答案了吗?

#10


我有疑问题,请求 jiangliangwei 或其他人能够解答:为什么我的VS2010和先前的VS2008都在启动调试和开始运行是说“此项目过期了”呢?

#11


引用 10 楼  的回复:
我有疑问题,请求 jiangliangwei 或其他人能够解答:为什么我的VS2010和先前的VS2008都在启动调试和开始运行是说“此项目过期了”呢?

那说明你改动了程序的,是否要生成新的ExE文件(就是release版本)替换原来的ExE文件。你直接点下次表提醒就是了。莫影响

#12


你试试将生成选项里面的优化代码去点看看

#1


“启动调试”和“开始执行(不调试)”的结果不一样

确定一下 你看的结果 是最后结果 不是中间结果

#2


“启动调试”和“开始执行(不调试)”会不一样,
但是不会导致最终结果不一样的。

#3


引用 1 楼 hmily821023 的回复:
“启动调试”和“开始执行(不调试)”的结果不一样

确定一下 你看的结果 是最后结果 不是中间结果


我做视频处理的,每处理完一帧我就把其结果用fprintf写到一个.dat文件中,用“开始执行”总是会出现大量的“-1.#QNAN0”,但是同一个版本,用“启动调试”就没有出现结果“-1.#QNAN0”,调试进去看结果都是对的

#4


一个是走你打的断点,一个直接运行

#5


那就OK了
可能是启动调试  需要些中间数据吧  .net处理过  干啥用得 咱就不知道了

#6


学习了。。。。

#7


程序源代码如下,希望各位指点:
        //计算光流保存到向量velocityFieldX,velocityFieldY:std::vector<float> 类型
        GetOpticalFlowFieldMask(mask,newObjRect,m_curFrame,m_nextFrame,velocityFieldX,velocityFieldY);


        //下面是把向量中的值写到dat文件
FILE* testFile;
char buffer1[65];
CString fileName;
_itoa((int)m_curFrameNum,buffer1,10);
char buffer2[65];
_itoa((int)(trackTemplate.poID),buffer2,10);
CString str = "logP";
fileName = m_resultPath + "\\" + "obj" + buffer2 + "velX" + buffer1 + ".dat";
testFile = fopen(fileName,"w");
for (int i = 0; i < velocityFieldX.size(); i++)
{
//CString str;
//str.Format("the current velocity is: %f",velocityFieldX[i]);
//AfxMessageBox(str);

//AfxMessageBox("reach this place");
//float temp = velocityFieldX[i];
//if (temp<-10000000000 || temp>10000000000)
//{
// AfxMessageBox("exist NAN");
//}
//fprintf(testFile,"%f\n",velocityFieldX[i]);
}
fclose(testFile);

      //在release版本下或者debug版本下,用“启动调试”和“开始执行(不调试)”结果不一样,“开始执行”的结果会出现很多的-1.#QANA0


GetOpticalFlowFieldMasik函数如下:

void GetOpticalFlowFieldMask(std::vector<int> &curMask,CRect &matchRange, IplImage * curImage, IplImage *nextFrame, vector<float> &velocityFieldX, vector<float> &velocityFieldY)
{
velocityFieldX.clear();
velocityFieldY.clear();
int nWidth = curImage->width;
int nHeight = curImage->height;
IplImage * curGrayImage = cvCreateImage(cvSize(curImage->width, curImage->height), IPL_DEPTH_8U, 1);
IplImage * nextGrayImage = cvCreateImage(cvSize(curImage->width, curImage->height), IPL_DEPTH_8U, 1);
IplImage * curGrayRect = cvCreateImage(cvSize(matchRange.Width()+1, matchRange.Height()+1), IPL_DEPTH_8U, 1);
IplImage * nextGrayRect = cvCreateImage(cvSize(matchRange.Width()+1, matchRange.Height()+1), IPL_DEPTH_8U, 1);
IplImage * velocityX = cvCreateImage(cvSize(matchRange.Width()+1, matchRange.Height()+1), IPL_DEPTH_32F, 1);
IplImage * velocityY = cvCreateImage(cvSize(matchRange.Width()+1, matchRange.Height()+1), IPL_DEPTH_32F, 1);
cvCopy(curImage,curGrayImage,NULL);
cvCopy(nextFrame,nextGrayImage,NULL);

curGrayImage->origin = 1;
nextGrayImage->origin = 1;
curGrayRect->origin = 1;
nextGrayRect->origin = 1;
velocityX->origin = 1;
velocityY->origin = 1;

for (int i = 0;i <= matchRange.Width();i++)
{
for (int j = 0;j <= matchRange.Height();j++)
{
int x = i + matchRange.left;
int y = j + matchRange.top;
if ( x >= 0 && x < curGrayImage->width && y >= 0 && y< curGrayImage->height)
{
*(curGrayRect->imageData + j * curGrayRect->widthStep + i) = *(curGrayImage->imageData + y * curGrayImage->widthStep + x);
*(nextGrayRect->imageData + j * nextGrayRect->widthStep + i) = *(nextGrayImage->imageData + y * nextGrayImage->widthStep + x);
}
}
}

//【L-K】
//cvCalcOpticalFlowLK(curGrayRect,nextGrayRect,cvSize(1,1),velocityX, velocityY);

//【H-S】
CvTermCriteria criteria;
criteria.epsilon = 0.1;
criteria.max_iter = 20;
criteria.type = CV_TERMCRIT_EPS;
cvCalcOpticalFlowHS(curGrayRect,nextGrayRect,3, velocityX, velocityY, 0.5, criteria);

//【Block Match】
//cvCalcOpticalFlowBM(curGrayRect,nextGrayRect,cvSize(5, 5), cvSize(1, 1), cvSize(10, 10), 1, velocityX, velocityY);

velocityFieldX.clear();
velocityFieldY.clear();
velocityFieldX.resize((matchRange.Width()+1) * (matchRange.Height()+1), 0);
velocityFieldY.resize((matchRange.Width()+1) * (matchRange.Height()+1), 0);

for(int i = 0;i <= matchRange.Width();i++)
{
for(int j = 0;j <= matchRange.Height();j++)
{
float Value = 0.0; 
int ii = i + matchRange.left;
int jj = j + matchRange.top;
if (curMask[ii+jj*m_imageWidth] == 0) 
{
Value = 0;
velocityFieldX[j * (matchRange.Width()+1) + i] = Value;
velocityFieldY[j * (matchRange.Width()+1) + i] = Value;
}
else
{
Value = ((float*)(velocityX->imageData + j * velocityX->widthStep))[i];
velocityFieldX[j * (matchRange.Width()+1) + i] = Value;
Value = ((float*)(velocityY->imageData + j * velocityY->widthStep))[i];
velocityFieldY[j * (matchRange.Width()+1) + i] = Value;
}
}
}

cvReleaseImage(&curGrayImage);
cvReleaseImage(&nextGrayImage);
cvReleaseImage(&curGrayRect);
cvReleaseImage(&nextGrayRect);
cvReleaseImage(&velocityX);
cvReleaseImage(&velocityY);
}
引用楼主 jiangliangwei 的回复:
一般情况下,没有断点的话“启动调试”和“开始执行(不调试)”的结果是一样的。可是我碰到一种情况,在没有断点的情况下,不管是debug还是release版本,“启动调试”和“开始执行(不调试)”的结果不一样是怎么回事呢?希望有大侠出来指点指点!

#8


难道是人品问题

#9


我现在也是这个问题  楼主有答案了吗?

#10


我有疑问题,请求 jiangliangwei 或其他人能够解答:为什么我的VS2010和先前的VS2008都在启动调试和开始运行是说“此项目过期了”呢?

#11


引用 10 楼  的回复:
我有疑问题,请求 jiangliangwei 或其他人能够解答:为什么我的VS2010和先前的VS2008都在启动调试和开始运行是说“此项目过期了”呢?

那说明你改动了程序的,是否要生成新的ExE文件(就是release版本)替换原来的ExE文件。你直接点下次表提醒就是了。莫影响

#12


你试试将生成选项里面的优化代码去点看看