首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

First-chance exception in biaodashiqiuzhi.exe: 0xC0000005: Access Violation.该如何处

2012-05-09 
First-chance exception in biaodashiqiuzhi.exe: 0xC0000005: Access Violation.#includeiostream#incl

First-chance exception in biaodashiqiuzhi.exe: 0xC0000005: Access Violation.
#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.”
请问是什么问题?该如何解决?

[解决办法]
断点跟踪到错误点。
[解决办法]
Debug下call stack,看看函数调用堆栈
[解决办法]
对类对象没有初始化,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();

热点排行