📄 subject_64476.htm
字号:
<p>
序号:64476 发表者:wanlei 发表日期:2003-12-10 22:57:18
<br>主题:程序运行或调试时CPU100%,内存还好,怎么回事?急,在线等
<br>内容:有数据如下:其中括号和说明是我加的,实际上只有纯数字<BR>现在想实现统计在每组分支点对总数的后面的空格符的个数,然后每得到一组总的空格符的个数后就把他们Add()给一个CArray(int,int)数组保存起来,现在的程序我附后面,但是现在的问题是只能运行两,三组数据(我跟踪了进去了的,整个程序逻辑工作的很好),组的个数超过10条就死机,CPU用100%,内存还好没用多少,请教高手这个问题怎么解决?是程序的判断和循环太多而造成的吗?如果是有什么办法改进,不是的话是其他的什么原因?<BR><BR>结构如下:<BR>105(组的个数)<BR>1(序号,第一组) 19(点对数,紧跟其后的是要计算的空格符) <BR>180 14376 180 14384 196 14384 208 14376 224 14368 <BR>228 14364 220 14352 208 14352 196 14356 192 14344 <BR>212 14308 212 14304 204 14304 184 14324 168 14336 <BR>164 14348 172 14356 180 14364 180 14376<BR>2(第二组) 8(同上)<BR>52 14376 60 14376 64 14368 64 14356 52 14356 <BR>52 14356 48 14364 52 14376 <BR>3 (第三组) 8(同上)<BR>716 14380 732 14380 752 14364 740 14336 732 14332 <BR>700 14360 700 14368 716 14380 <BR> .<BR> . <BR> .<BR>105 6<BR>348 14356 312 14344 300 14344 288 14332 300 14324 <BR>304 14320 <BR><BR>程序如下(一段),关键是逻辑的问题帮我看看,或是要优化的地方<BR>typedef CArray<int,int&>intArray;<BR>CFile File=0; //需要打开的文件<BR> <BR> //打开文件对话框<BR> CFileDialog dlg(TRUE, 0, 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "*.txt|*.txt|\0");<BR> <BR> if (dlg.DoModal()==IDOK)<BR> {<BR> <BR> if(!File.Open((LPCTSTR)dlg.GetPathName(),CFile::modeRead)) <BR> return;<BR> <BR> int nLen=File.GetLength(); //得到要打开的文件的长度<BR> int SumCount=0; //等高线的总个数<BR> int BranchSumcount=0; //分支数点对的总个数<BR> <BR> int countspace=0; //读进的空格个个数<BR> int branchreadcount=0; //读入的分支点点个个数<BR> char s[10]; //把读入的每个字符串放在这里<BR> char ch; //每次读一个CHAR,因为是ANSI码表示的,所以一次一个CHAR,这个详细的结构见附带的图表所示<BR> int i=0; //S中的字符的初始位置设为0<BR> int meetflag=0; //碰到字符的标志<BR> DWORD readcount=0; //读了多少个String进去<BR> //这个地方最好用一个BOOL变量! ! ! ! ! ! ! ! ! ! ! ! !<BR> // BOOL SnFlag=FALSE;//把序列号开关<BR> BOOL BranchSumcountFlag=FALSE;//分支总数开关<BR> BOOL WaterMarkFlag=FALSE; //空格水印开关<BR> //BOOL BranchDataFlage=FALSE; //每条等高线的数据开关<BR> BOOL DataReadingFlag=FALSE; //是否正在读每条等高线的数据<BR> //BOOL BranchmeetFirst=FALSE;<BR> BOOL MeetWaterMark=FALSE;<BR><BR> for(int j=0;j<nLen;j++)<BR> {<BR> File.Read(&ch,1); //每次读一个字符<BR> <BR> //判断是否是数字//如果碰到的是数字<BR> if(check(ch)==0) <BR> {<BR> s[i]=ch;<BR> i++;<BR> meetflag=1; //had meet 0.1.2.....9<BR> }<BR> <BR> <BR> //如果没有碰到数字,判断是第一次还是读完了一串 <BR> else <BR> {<BR> //这里是判断是否到了空格加密段,如果是就往下<BR> if(WaterMarkFlag==TRUE)//&&ch==32)<BR> { <BR> <BR> // static int countspace=0;<BR> if((ch)!=13&&ch==32)//如果没有碰到回车符和换行符,就累加<BR> //13是回车的ASCII<BR> {<BR> countspace++; //\r=Carriage return \n=newline<BR> MeetWaterMark=TRUE;<BR> }<BR> <BR> else<BR> {<BR> if(MeetWaterMark==TRUE) //如果到头了就把得到的加密字符加进到半字节数组中去<BR> { <BR> //这个地方要把加密的半字节保存<BR> <BR> m_pWaterHalfIntArray->Add(countspace);<BR> countspace=0; //同时这个地方清零<BR> WaterMarkFlag=FALSE;//空格水印失效<BR> DataReadingFlag=TRUE;//数据读入有效<BR> // SnFlag=TRUE;<BR> MeetWaterMark=FALSE;<BR> }<BR> }<BR> }<BR> <BR> //如果没有到加密段,则按一般的处理<BR> if(WaterMarkFlag==FALSE)<BR> {<BR> if(meetflag==1) //读完了一串<BR> {<BR> s[i]='\0'; //在字符串后加上结束标志<BR> i=0;<BR> int datatemp=atoi(s); //STRING转换为INT<BR> meetflag=0;<BR> <BR> <BR> //SumCount=datatemp;//把开头的数赋给等高线的总个数SumCount<BR> readcount++; //在过2次后面就没有用了 1.2<BR> if(readcount<3) //如果读的是第一个,即总数的等高线个数<BR> {<BR> if(readcount==1)<BR> {<BR> m_PIntArray->Add(datatemp); //保存到数组中去,这里的数据是一个一个保存的<BR> }<BR> if(readcount==2) //在读第二个数的时候就把后面的总数开关打开<BR> { //唯一的一次开<BR> <BR> BranchSumcountFlag=TRUE; //这个地方是第一次触发,也只用一次<BR> m_PIntArray->Add(datatemp);//这个地方要加进去<BR> //BranchmeetFirst=TRUE;<BR> }<BR> }<BR> <BR> <BR> if(BranchSumcountFlag==TRUE&&<BR> readcount!=2)<BR> {<BR> <BR> BranchSumcount=datatemp;<BR> m_PIntArray->Add(datatemp);<BR> BranchSumcountFlag=FALSE; <BR> WaterMarkFlag=TRUE;//空格水印开关打开,在上面读字符的时候用 //这个地方滞后一个字节<BR> //DataReadingFlag=TRUE;<BR> <BR> }<BR> if(DataReadingFlag==TRUE)<BR> {<BR> <BR> if(branchreadcount<(BranchSumcount+2)*2+1)<BR> {<BR> m_PIntArray->Add(datatemp); <BR> branchreadcount++;<BR> <BR> //}<BR> // else<BR> // {<BR> if(branchreadcount-1==(BranchSumcount+2)*2)//这个地方-1很重要<BR> { //如果不减一,他就会读到后面一个数上去了<BR> branchreadcount=0;<BR> BranchSumcountFlag=TRUE; //这个地方是第二次触发,循环触发<BR> DataReadingFlag=FALSE; <BR> }<BR> }<BR> <BR> }<BR> }<BR> }<BR> }<BR> }<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -