First-chance exception in biaodashiqiuzhi.exe: 0xC0000005: Access Violation.

yk2406100230 2012-05-06 08:23:46
#include<iostream>
#include "c.h"
using namespace std;

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

template<typename T>class SqStack
{
public:
T *base;
T *top;
T e;
int size;
public:
void InitStack(SqStack)//声明栈建立函数
{
base=(T *)malloc(STACK_INIT_SIZE *sizeof(T));
if(!base)cout<<"存储分配失败!";//存储分配失败
top=base;
size=STACK_INIT_SIZE;
}
void Push(T e)//入栈
{
if((top - base)>=size)//栈满,追加存储空间
{
base=(T *)realloc(base,(size+STACKINCREMENT)*sizeof(T));
if(!base)cout<<"存储分配失败!";
else
{
top=base+size;
size=size+STACKINCREMENT;
}
}
*top=e;
top = top+1;//将元素e入栈,指针上移
}
T GetTop()//取栈顶元素
{
T e;
if(top==base)cout<<"\n运算符栈已空!\n";
else e=*(top-1);
return e;
}
T Pop()//出栈
{
T e;
if(top==base)cout<<"\n运算符栈已空!\n";
e=*(--top);
return e;
}
/* void DispStack()//从栈底到栈顶依次输出各元素
{
T e,*p;
if(top==base)cout<<" ";
else
{
p=base;
while(p<top)
{
e=*p;
p++;
cout<<e;
}
}
}*/
};

template<typename T>class Evaluate
{
private:
char c,m,n;
float a,b;
bool Operator(char c); //判断c是否为7中运算符之一
float Operate(float a,char c,float b); //运算函数
char Compare(char m,char n); //运算符的优先级比较
public:
void Expression();
};

bool Evaluate<void>::Operator(char c) //判断c是否为7中运算符之一
{
switch (c)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#': return true;
default: return false;
}
}

float Evaluate<void>::Operate(float a,char c,float b) //运算函数
{
float sum=0;
if (c=='+') sum=a+b; //从运算符栈取出的符号为"+",则运算数栈的两元素相加,并返回
else if(c=='-') sum=a-b; //从运算符栈取出的符号为"-",则运算数栈的两元素相减,并返回
else if(c=='*') sum=a*b; //从运算符栈取出的符号为"*",则运算数栈的两元素相乘,并返回
else if(c=='/') //从运算符栈取出的符号为"/",则运算数栈的两元素相除,并返回
{
if(b==0) cout<<"\n表达式出错!除数不能为0!\n";
else sum=a/b;
}
return sum;
}

char Evaluate<void>::Compare(char m,char n) //运算符的优先级比较
{
if(n=='+'||n=='-') //输入符号为"+"、"-"
{
if(m=='('||m=='#')return '<'; //栈顶元素为"("、"#",此时栈顶符号优先级低,返回"<"
else return '>'; //否则,栈顶符号优先级高,返回">"
}
else if(n=='*'||n=='/') //输入的符号为"*"、"/"
{
if(m==')'||m=='*'||m=='/')return '>'; //栈顶元素为")"、"*"、"/",此时栈顶符号优先级高,返回">"
else return '<'; //否则,栈顶符号优先级低,返回"<"
}
else if(n=='(')return'<'; //输入的符号为"(",则直接返回"<"
else if(n==')') //输入的符号为")"
{
if(m=='(')return'='; //栈顶元素为"(",此时优先级同,返回"="
else return '>'; //否则,栈顶符号优先级高,返回">"
}
else //输入符号为其他
{
if(m=='#')return'='; //栈顶元素为"#",此时优先级同,返回"="
else return '>'; //否则,栈顶符号优先级高,返回">"
}
}

void Evaluate<void>::Expression()
{
SqStack<char> OPTR;
SqStack<float> OPND;

char c;
float t,e,p1,p2;
int n=0,i=1,j=0,l=0;
char w[STACK_INIT_SIZE];

cout<<"请输入算术表达式,负数用(0-正数)表示,以'#'结束:\n "<<endl;
cin>>w;
c=w[0];
// w=w +'#';
int s=1;
char ch1;
OPTR.Push('#');//将'#'入栈,作为低级运算符
c=w[0];
while(c!='#'||OPTR.GetTop()!='#')
{
qq:
if(!Operator(c))//输入的字符如果不是运算符号,则继续输入直到输入的是运算符为止,将非运算符转换成浮点数
{
if(!(c=='.')&&n>=0)
{
e=float(c-48);
n++;
if(n==1)t=e;
else if(n>1)t=t*10+e;
c=w[s++];
}
if(n==-1)
{
e=float(c-48);
t=t+e/10;
c=w[s++];
}
if(c=='.')
{
n=-1;
c=w[s++];
}
if((c>='0'&&c<='9')||c=='.')
{
goto qq;
}
if(c<'0'||c>'9')
{
OPND.Push(t);
}
}
else//输入的是运算符
{
n=0;//非运算型数据计数器清零
switch(Compare(OPTR.GetTop(),c))//比较运算符优先级
{
case '<'://栈顶元素优先级低,则入栈且继续输入
OPTR.Push(c);
c=w[s++];
break;
case '='://栈顶元素优先级相等,脱括号并接收下一字符
OPTR.Pop();
c=w[s++];
break;
case '>'://栈顶元素优先级高,则退栈并将运算结果入栈
p1=OPND.Pop();
p2=OPND.Pop();
ch1=OPTR.Pop();
OPND.Push(Operate(p2,ch1,p1));
break;
}
}
}
if(OPND.top-1==OPND.base)//显示表达式的最终结果
cout<<"\n表达式的结果为:"<<OPND.GetTop()<<endl;
else cout<<"\n表达式有误!\n";
}

void main()
{
// char w[STACK_INIT_SIZE];
Evaluate<void> E;
E.Expression();
// cout<<"请输入算术表达式,负数用(0-正数)表示:"<<endl;
// cin>>w;
// cout<<"表达式结果等于" E.Expression(w);

}


此程序在运行时出现“First-chance exception in biaodashiqiuzhi.exe: 0xC0000005: Access Violation.”
请问是什么问题?该如何解决?
...全文
283 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
SONG_CA 2012-05-06
  • 打赏
  • 举报
回复
对类对象没有初始化,void Evaluate<void>::Expression()
{
SqStack<char> OPTR;
SqStack<float> OPND;

主要是对模板类中的函数
void InitStack(SqStack)//声明栈建立函数
没有看明白

感觉如下:
模板类中的函数改为如下:
void InitStack()//声明栈建立函数

对类对象进行初始化,void Evaluate<void>::Expression()
{
SqStack<char> OPTR;
SqStack<float> OPND;

OPTR.InitStack();
OPND.InitStack();
Eleven 2012-05-06
  • 打赏
  • 举报
回复
Debug下call stack,看看函数调用堆栈
mars_man 2012-05-06
  • 打赏
  • 举报
回复
断点跟踪到错误点。
yk2406100230 2012-05-06
  • 打赏
  • 举报
回复
三楼,谢了!问题以解决!

64,648

社区成员

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

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