读书人

c++程序运行时产生异常报告

发布时间: 2012-04-08 14:38:30 作者: rapoo

c++程序运行时产生错误报告
在运行一个c++基于规则推理的程序时候,编译执行都没问题,总是在运行时候,一开始如果敲个Y,就出现错误报告窗口。
下面是文件:
//Fact.h
#ifndef _FACT_H_
#define _FACT_H_


#define True 1
#define False 0
#define UNKnow -1

//define class Fact
class Fact
{
int Number;
int TorF;
public: Fact *Next;
Fact (int number); //constuction fuction
int GetNumber();
int GetTorF();
void SetTorF(int torf);
};

#endif

//Fact.cpp
#include "Fact.h"
#define NULL 0
Fact::Fact (int number)
{
Number = number;
Next = NULL;
TorF = UNKnow;
}
int Fact::GetNumber()
{
return Number;
}
int Fact::GetTorF()
{
return TorF;
}
void Fact::SetTorF(int torf)
{
TorF = torf;
}

//List.h
#ifndef _LIST_H_
#define _LIST_H_

//define class
class List
{
int Number;
public: List *Next;
List (int number);
int GetNumber();
};
#endif

//List.cpp
#include "List.h"
#define NULL 0
List::List (int number)
{
Number = number;
Next = NULL;
}
int List::GetNumber()
{
return Number;
}

//Rule.h
#ifndef _RULE_H_
#define _RULE_H_

#include "List.h"
#include "Fact.h"
#include <iostream>
using namespace std;

class Rule
{
int Number;
List *pCause;
int Result;
public: Rule *Next;
Rule (int number,int a[]); //construction function
~Rule(); //destruction function
int Query();
int GetNumber();
};
#endif

//Rule.cpp
#include "Rule.h"
#include "List.h"
#include "Fact.h"
#include <iostream>

extern Fact* fact; //定义一个*fact指向事实类的链表头
using namespace std;
extern char*str[6]; //={"中年人","老练","细心","有驾驶经验","不出交通事故","\0"};
Rule::Rule (int number,int a[]) //默认的为a[0]-a[3]共四个数,以后为了保证程序的健壮性,要修改。
{
int i;
pCause = NULL;
Next = NULL;
List *l;
Number = number;
i = 0;
while ((a[i]!=-1) && (i < 3))
{
l = new List(i++);
l->Next = pCause;
pCause = l; //初始化之后的顺序为pCause->a[2]->a[1]->a[0]->null;
}
Result = a[3];
}

Rule::~Rule()
{
List *l;
while (pCause)
{
l = pCause->Next;
delete pCause;
pCause = l;
}
}

int Rule::Query()
{
char c;
List *l;
Fact *f;
l = pCause;
for (;l!=NULL;)
{
f = fact; //初始化事实指针,每次都指向初始化以后的那个事实。
for(;;)
{
if (l->GetNumber()== f->GetNumber()) //寻找匹配的事实号,如果条件号和事实号匹配,则跳出循环,进行GetTorF
break;
f = f->Next;
}

if (f->GetTorF()==True)
{
l = l->Next; //如果此条规则的条件事实号为正确,则继续试验下一条条件事实号
continue;
}
if (f->GetTorF()==False)
{
return False; //如果此条规则有一个条件事实号不正确,则返回错误选项。
}
if (f->GetTorF()==UNKnow)
{
cout<<str[f->GetNumber()]<<"please enter Y/N:"<<endl; //询问,手动输入第某条规则的正确性
cin>>c;
if (c=='Y' || c=='y') //如果手动输入确定为正确,且将事实库中的事实由不知道置为正确。则读取下一条规则
{
f->SetTorF(True);
l = l->Next;
}
else if (c=='N' || c=='n') //如果手动输入确定为错误,则返回错误
{
f->SetTorF(False);
return False;
}
}
}
//此时所有的规则中的条件已全部符合,Result应该有错,这一段程序总是出错


if (Result < 4) //通过Result查看是不是最终结果4
{
for(;;)
{
if (Result == (f->GetNumber()))
break;
f = f->Next;
}
f->SetTorF(True);
return False;
}
else
{
cout<<"\n"<<str[Result]<<endl;
return True;
}

}
int Rule::GetNumber()
{
return Number;
}

//主程序.cpp
#include "List.h"
#include "Fact.h"
#include "Rule.h"
#include <iostream>

using namespace std;
//全局变量
Fact *fact; //定义一个*fact指向事实类的链表头
char *str[6] = {"中年人","老练","细心","有驾驶经验","不出交通事故","\0"};
int a[][4] = {{1,2,3,4},{0,-1,-1,1},{0,-1,-1,2}};

int main()
{
Fact *f;
Rule *rule,*r;
int i = 0;
fact = NULL;
//初始化Fact
while (str[i]!="\0")
{
f = new Fact(i++);
f->Next = fact;
fact = f;
}
rule = NULL;
for (i = 0;i < 3;i++)
{
r = new Rule(i,a[i]);
r->Next = rule;
rule = r;
}
for (;;)
{
i = rule->Query ();
if (i == True)
{
cout<<"规则"<<rule->GetNumber()<<"验证完毕!结果为(1真0假):"<<i<<endl;
}
else
{
cout<<"规则"<<rule->GetNumber()<<"验证完毕!结果为(1真0假):"<<i<<endl;
cout<<endl<<"可能会出交通事故!"<<endl;
}
rule=rule->Next ;
if (rule==NULL)
{
cout<<"按任意键退出"<<endl;
getchar();
//getchar();
break;
}
}
return true;
}

小弟菜鸟,希望遇到大侠帮忙。。感激不尽。

[解决办法]
代码太乱了 太难看
[解决办法]

探讨
在运行一个c++基于规则推理的程序时候,编译执行都没问题,总是在运行时候,一开始如果敲个Y,就出现错误报告窗口。
下面是文件:
//Fact.h
#ifndef _FACT_H_
#define _FACT_H_


#define True 1
#define False 0
#define UNKnow -1

//define class Fact
class Fac……

[解决办法]
单步调试和设断点调试是程序员必须掌握的技能之一。

读书人网 >C++

热点推荐