程序未响应问题

wo623deyingxiong 2009-06-04 12:39:17
写了一个中序表达式计算器,但是在按“=”按钮以后,出现程序未响应问题。而且在调试过程中,工程文件也损坏,晕倒。希望高手指出问题所在。下面是程序的主要代码:

void MySetWindowText(HWND hwnd,TCHAR* cInput,int idEditBox=IDC_EDT);
////////////////////////////////////////////////////////////////////////////////
// Main_OnCommand
////////////////////////////////////////////变量声明
int integer;
int a,b,res;
char op;
char cExpression[255];

Stack<char> sOperator;
Stack<int> sInteger;
////////////////////////////////////////////////
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
//Stack<char> s;
switch(id)
{
case IDC_BTN0:MySetWindowText(hwnd,"0");break;
case IDC_BTN1:MySetWindowText(hwnd,"1");break;
case IDC_BTN2:MySetWindowText(hwnd,"2");break;
case IDC_BTN3:MySetWindowText(hwnd,"3");break;
case IDC_BTN4:MySetWindowText(hwnd,"4");break;
case IDC_BTN5:MySetWindowText(hwnd,"5");break;
case IDC_BTN6:MySetWindowText(hwnd,"6");break;
case IDC_BTN7:MySetWindowText(hwnd,"7");break;
case IDC_BTN8:MySetWindowText(hwnd,"8");break;
case IDC_BTN9:MySetWindowText(hwnd,"9");break;

case IDC_BTNPLUS :MySetWindowText(hwnd,"+");break;
case IDC_BTNMINUS :MySetWindowText(hwnd,"-");break;
case IDC_BTNMULTIPLY:MySetWindowText(hwnd,"*");break;
case IDC_BTNDIVIDE :MySetWindowText(hwnd,"/");break;
case IDC_BTNLpar :MySetWindowText(hwnd,"(");break;
case IDC_BTNRpar :MySetWindowText(hwnd,")");break;

case IDC_BTNEQUALl://这里响应了“=”按键
{
ZeroMemory(cExpression,255);

GetWindowText(GetDlgItem(hwnd,IDC_EDT),cExpression,255);
stringWork(cExpression);
sOperator.push('#');
int i=0;

while(cExpression[i]!='#'||sOperator.retrieve()!='#')//当表达式和栈中元素均为'#'时。结束
{
if(readInteger(cExpression,i,integer))
{
sInteger.push(integer);
i++;//取下一个字符;
}
else
switch(PRICompare(sOperator.retrieve(),cExpression[i]))
{
case -1:
{
sOperator.push(cExpression[i]);
i++;
}
break;
case 0://脱括号,并接受下一字符
{
sOperator.pop(op);
i++;
}
break;
case 1://退栈并将运算结果入栈。
{
sOperator.pop(op);

sInteger.pop(b);
sInteger.pop(a);

calculate(op,a,b,res);

sInteger.push(res);
}
break;
case 2:
MessageBox(NULL,"表达式存在语法错误","语法错误",MB_ICONERROR||MB_OK);
break;

default:break;
}//end switch
}//end while
ZeroMemory(cExpression,255);
itoa(sInteger.retrieve(),cExpression,10);
SetWindowText(GetDlgItem(hwnd,IDC_EDT),cExpression);
}

break;
default:break;
}

}

void MySetWindowText(HWND hwnd,TCHAR* cInput,int idEditBox)
{
TCHAR cCurrent[255];
ZeroMemory(cCurrent,255);

GetWindowText(GetDlgItem(hwnd,idEditBox),cCurrent,255);
lstrcat(cCurrent,cInput);

SetWindowText(GetDlgItem(hwnd,idEditBox),cCurrent);

}

这是用到的辅助函数的声明:assist.h

#ifndef _ASSIST_H
#define _ASSIST_H

int ChtoInt(char p);
int PRICompare(char oper1, char oper2);
bool readInteger(const char* cStr, int& index,int& iResult);
void calculate(char oper,int a,int b,int& c);
void stringWork(char* str);
#endif

还有一个栈类,是一个模板,实现和声明都放到头文件里。还有就是 我是再把readInteger函数第二个参数改成引用后,出现未响应问题的。
...全文
162 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wo623deyingxiong 2009-06-04
  • 打赏
  • 举报
回复
i是对字符进行定位的,当读完整数后,需要把i定位到整数包含的最后一个字符。
goodname 2009-06-04
  • 打赏
  • 举报
回复
如果说你把readInteger函数第二个参数改成引用后,出现未响应问题的

只能说明你的readInteger函数对i的值进行了修改所导致的

64,682

社区成员

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

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