新手求教MFC问题!程序已停止工作~~

adiasd 2014-08-06 10:14:01
第一次接触mfc,我尽量把问题描述清楚,麻烦各位大神帮帮忙~小女子不胜感激!!!
“答案”按钮消息响应函数实现的功能我分成了 两部分,一个是解答随机生成的题目,一个是解答自己加载的题目,两个算法不一样。问题出现在第二个算法。
	else{
int blank=0;
for(int i=0;i<9;i++)
for(int j=0;j<9;j++){
if(sd[i][j]==0) blank++;
}

dfs(blank);
condition=2;//
condition_show=0;
show(0,0,m_a11);
。。。。(省略81-2个)
show(8,8,m_z99);


}
}

上述就是判断是自己加载的题目,

void CShuduDlg::refresh() //????
{

CFont m_font;

m_font.CreateFont(33,0,0,0,700,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,_T("????"));

for (int index=IDC_EDIT_a1;index<=IDC_EDIT_z9;index++)
{
int temp=index-IDC_EDIT2;
if (sd_title[temp/3][temp%3]==0)
{
if(sd_title[temp/3][temp%3]!=0){
SetDlgItemInt(index,sd_title[temp/3][temp%3]);
CEdit* pedit=NULL;
pedit=(CEdit*)GetDlgItem(index);
pedit->SetLimitText(1);
pedit->SetFont(&m_font);
pedit->EnableWindow(true);
}
else{
SetDlgItemText(index,_T(""));
CEdit* pedit=NULL;
pedit=(CEdit*)GetDlgItem(index);
pedit->EnableWindow(true);
}
}
else{
SetDlgItemInt(index,sd_title[temp/3][temp%3]);
CEdit* pedit=NULL;
pedit=(CEdit*)GetDlgItem(index);
pedit->SetLimitText(1);
pedit->SetFont(&m_font);
pedit->EnableWindow(false);
}
}

UpdateWindow();
Sleep(50);
}

int funHx(int row, int col,int mark[]) //????????????
{
int count=0;
for(int i=0;i<10;i++) mark[i]=0;
for(i=0;i<9;i++){
mark[sd_title[row][i]]=1;//?
mark[sd_title[i][col]]=1;//?
}
row=row/3*3;
col=col/3*3;
for(i=0;i<3;i++){
for(int j=0;j<3;j++)
mark[sd_title[row+i][col+j]]=1;
}
for(i=1;i<10;i++)
if(mark[i]==0) count++;
return count;
}



bool CShuduDlg::dfs(int blank) //?????
{
int min=10;
int ii,jj;
int count;
int mark[10];
if(blank<=0) return true;
for(int j=0;j<9;j++){
if(sd_title[i][j]!=0) continue;
count=funHx(i,j,mark);
if(count<=1) {min=count;ii=i;jj=j;break;}
if(count<min){min=count;ii=i;jj=j;}
}
if(min==0||min==10) return false;
else if(min==1){
for(int i=1;i<10;i++)
if(mark[i]==0){
sd_title[ii][jj]=i;
blank--;
refresh();
if(dfs(blank)) return true;
sd_title[ii][jj]=0;
refresh();
blank++;
}
else{
sd_title[ii][jj]=i;
refresh();
sd_title[ii][jj]=0;
}
}
else{
count=funHx(ii,jj,mark); //??????1,????????????????
for(int i=1;i<10;i++){
if(mark[i]==0){
sd_title[ii][jj]=i;
blank--;
refresh();
if(dfs(blank)) return true;
sd_title[ii][jj]=0;
refresh();
blank++;
}
else{
sd_title[ii][jj]=i;
refresh();
sd_title[ii][jj]=0;
}
}
}
return false;
}

以上是用到的三个函数。
问题就是程序其他的功能都正常,就是我加载了一个题目后,再点击“答案”按钮,程序就会停止工作。。。。。

我把加载题目的函数也给出来好了:
void CShuduDlg::OnBUTTONread()
{
// TODO: Add your control notification handler code here
CString FilePathName;
CFileDialog dlg(true,".txt","Sudoku.txt",OFN_OVERWRITEPROMPT,"Txt Files (*.txt)|*.txt|Data Files (*.dat)|*.dat|All Files (*.*)|*.*||");
dlg.m_ofn.lpstrInitialDir=_T(".\\");
if(dlg.DoModal()==IDOK)
FilePathName=dlg.GetPathName();
ifstream ifile;
ifile.open(FilePathName);
char c_read[7];

for(int r=0;r<7;r++) ifile>>c_read[r];
ifile.get();

bool b_read=true;
if(c_read[0]!='S') {b_read=false;goto SSS;}
if(c_read[1]!='u') {b_read=false;goto SSS;}
if(c_read[2]!='d') {b_read=false;goto SSS;}
if(c_read[3]!='o') {b_read=false;goto SSS;}
if(c_read[4]!='k') {b_read=false;goto SSS;}
if(c_read[5]!='u') {b_read=false;goto SSS;}
if(c_read[6]!=':') {b_read=false;goto SSS;}

SSS:
if(b_read)
{

for(int i=0;i<9;i++)
for(int j=0;j<9;j++) ifile>>sd_title[i][j];

ifile.close();
read_noAnswer=1;


//Öظ´newÖеIJÙ×÷
OnBUTTONclear();
condition=1;
k=::GetTickCount();

tips_switch=2;
tips_switchs=2;
tips_switch=tips_switchs%2;



for(int x=0;x<9;x++)
for(int y=0;y<9;y++){
sd_read[x][y]=sd_title[x][y];
}

setReadOnly();
}
else
(特殊字符删掉了)

}
...全文
996 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamsea1984 2015-11-26
  • 打赏
  • 举报
回复
首先确定一下,在VC6中,红色感叹号(Ctrl+F5)运行Release版本,是否有问题。 一般来说,三种可能比较高: 支持文件路径问题,因为两种方式的区别是当前工作目录不同,将exe复制到工程文件所在目录运行试试。 动态编译问题。默认Release是动态编译MFC,Debug是静态。将Release版本的工程配置选择为静态编译MFC,Rebuild All重新编译试试。 Win7造成的问题。这个可以在静态编译后,到XP下运行试试。
叶恭介叶恭介 2014-08-08
  • 打赏
  • 举报
回复
发给我吧。看看....
vcf_reader 2014-08-08
  • 打赏
  • 举报
回复
必须确保下标不超出范围
vcf_reader 2014-08-08
  • 打赏
  • 举报
回复
必须确保下表不超出范围
lx624909677 2014-08-07
  • 打赏
  • 举报
回复
在Debug模式下调式,看看断在哪儿了,只说个已经停止工作了谁也帮不了你
brk1985 2014-08-07
  • 打赏
  • 举报
回复
断点调试,才可以确定什么原因造成的
阿源是少年 2014-08-07
  • 打赏
  • 举报
回复
在按钮响应函数开头打一个断点,一行一行的跟进,看是在哪行发生了崩溃就说明哪行发生了问题,最大可能就是 空指针 野指针缓冲区溢出,这个你得自己慢慢调试了,非明显错误,光看源代码是不容易排除的,必须要打断点调试
kuankuan_qiao 2014-08-07
  • 打赏
  • 举报
回复
崩崩更健康
赵4老师 2014-08-07
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
oyljerry 2014-08-07
  • 打赏
  • 举报
回复
单步跟踪调试一下。
shen_wei 2014-08-07
  • 打赏
  • 举报
回复
只能单步看看。。学习调试才是关键。。
Eleven 2014-08-07
  • 打赏
  • 举报
回复
Debug下调试一下,看到你上面很多操作数组的,确保下标有效~
zhuyf87 2014-08-07
  • 打赏
  • 举报
回复
试试单步调试

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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