BC中无法初始化绘图(DOS下的)

stellaxyq 2000-05-28 10:49:00
用BC++5。0编的DOS程序,我已经写了initgraph函数,但每次运行都显示
BGI Error Graphic not initialized.
为什么?

源代码如下
#define MAXCN 400 //最大群体规模
#define MAXVN 2 //最大变量数
#define PI 3.1415926

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
//#include "time.h"
#include "graphics.h"


//void far _BGIENTRY putpixel(int __x, int __y, int __color);

float Gauss(int i,int j)
{
return 0;
}


class Colony
{
private:
float Chromosome[MAXCN][MAXVN]; //染色体,第一维是群体规模,第二维是染色体值
int n; //群体规模
int vn; //变量数
float value[MAXCN]; //适应值
int p; //联赛选择规模
float pc; //杂交率
float pm; //变异率
float scope; //变量范围
public:

Colony( int n_v, int vn_v, int p_v,float pc_v,float pm_v,float scope_v);
//~Colony();
//void cal_val( float( *function)(int i) );
void choice();
void intercross(); //交叉
void variation(); //变异
//void f1();
void f2();
//void f3();
//void f4();
void f5();
void draw();
void setpc(float pc_v);
void setpm(float pm_v);
};

Colony::Colony(int n_v,int vn_v,int p_v,float pc_v,float pm_v,float scope_v)
{
int i,j;
float random; //0-1之间的随机数
n=n_v;
vn=vn_v;
p=p_v;
pc=pc_v;
pm=pm_v;
scope=scope_v;

//srand( (unsigned)time( NULL ) );

for (i=0;i<n;i++)
{
for(j=0;j<vn;j++)
{
//随机产生一个变量
random=rand()/(float)RAND_MAX;
Chromosome[i][j]=-scope+2*scope*random;
}

}
}


void Colony::setpc(float pc_v)
{
pc=pc_v;
}

void Colony::setpm(float pm_v)
{
pm=pm_v;
}



void Colony::choice()
{
int i,j;
float random; //0-1之间的随机数
int max; //适应值最高的染色体位置
int num;
float next_chromosome[MAXCN][MAXVN];

//srand( (unsigned)time( NULL ) );

for (i=0;i<n;i++)
{
max=0;
for (j=0;j<p;j++)
{
//随机选择一个染色体
random=rand()/(float)RAND_MAX;
num=(int)(random*n);
if (value[num]>value[max])
max=num;
}
for(j=0;j<vn;j++)
next_chromosome[i][j]=Chromosome[max][j];

}
for(i=0;i<n;i++)
for(j=0;j<vn;j++)
Chromosome[i][j]=next_chromosome[i][j];

}


void Colony::intercross()
{
int i,j;
float random;
int internum=0;
int locatex,locatey,interlocate;
float temp;

//srand( (unsigned)time( NULL ) );

for (i=0;i<n;i++)
{
//产生0-1之间的随机数
random=rand()/(float)RAND_MAX;
if (random<pc)
{
internum++;
if(internum==1)
locatex=i;
if(internum==2)
{
internum=0;
locatey=i;
random=rand()/(float)RAND_MAX;
interlocate=(int)(random*vn);
for(j=interlocate;j<vn;j++)
{
temp=Chromosome[locatex][j];
Chromosome[locatex][j]=Chromosome[locatey][j];
Chromosome[locatey][j]=temp;
}
}
}
}
}



void Colony::variation()
{
int i;
int vlocate;
float random;
float vvalue;

//srand( (unsigned)time( NULL ) );

for(i=0;i<n;i++)
{
random=rand()/(float)RAND_MAX;
if (random<pm)
{
random=rand()/(float)RAND_MAX;
vlocate=(int)(random*vn);
random=rand()/(float)RAND_MAX;
vvalue=-scope+2*scope*random;
Chromosome[i][vlocate]=vvalue;

}
}
}




void Colony::f2()
{
int i;
float val;
float x1,x2;
for (i=0;i<n;i++)
{
x1=Chromosome[i][0];
x2=Chromosome[i][1];
val=100*pow(x1*x1-x2,2)+pow(1-x1,2);
value[i]=val;
}
}





void Colony::f5()
{
int i;
float val;
float x,y;
for(i=0;i<n;i++)
{
x=Chromosome[i][0];
y=Chromosome[i][1];
val=4+x*x+y*y-8*cos(2*PI*x)-8*cos(2*PI*y);
value[i]=-val;
}
}

void Colony::draw()
{
int i;
float maxv=0;//最大适应值
float x,y;
int maxnum;//最大适应值的染色体位置;

for(i=0;i<n;i++)
{
if(value[i]>maxv)
{
maxv=value[i];
maxnum=i;
}
}
x=Chromosome[maxnum][0];
y=Chromosome[maxnum][1];
putpixel(x,y,WHITE);
}



void main(void)
{
int eranum=200;//指定代数
int gen;//当前代数
int cn=400;//群体规模
float pcv=0.6;//交叉率
float pmv=0.01;//变异率
int pv=100;//联赛规模

int gdriver,gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver,&gmode,"...\\bgi");


Colony *ex2=new Colony(cn,2,pv,pcv,pmv,2.048);


Colony *ex5=new Colony(cn,2,pv,pcv,pmv,1.00);



printf("只使用选择算子:\n");
printf("Fuction 2:\n");
for(gen=0;gen<eranum;gen++)
{
ex2->f2();
ex2->choice();
ex2->draw();

}


printf("按任意键继续:");
getch();






printf("Function 5:\n");
for(gen=0;gen<eranum;gen++)
{
ex5->f5();
ex5->choice();
ex5->draw();

}


printf("按任意键继续:");
getch();

printf("只使用交叉算子(pc=%f):\n",pcv);

printf("Fuction 2:\n");
for(gen=0;gen<eranum;gen++)
{
ex2->f2();
ex2->intercross();
ex2->draw();

}

printf("按任意键继续:");
getch();

printf("Function 5:\n");
for(gen=0;gen<eranum;gen++)
{
ex5->f5();
ex5->intercross();
ex5->draw();

}


printf("按任意键继续:");
getch();

printf("只使用变异算子(pm=%f)\n",pmv);
printf("Fuction 2:\n");
for(gen=0;gen<eranum;gen++)
{
ex2->f2();
ex2->variation();
ex2->draw();

}

printf("按任意键继续:");
getch();

printf("Function 5:\n");
for(gen=0;gen<eranum;gen++)
{
ex5->f5();
ex5->variation();
ex5->draw();

}


printf("按任意键继续:");
getch();

pcv=0.2;
ex2->setpc(pcv);
ex5->setpc(pcv);
printf("改变交叉算子(pc=%f)\n",pcv);

printf("Fuction 2:\n");
for(gen=0;gen<eranum;gen++)
{
ex2->f2();
ex2->intercross();
ex2->draw();

}

printf("按任意键继续:");
getch();

printf("Function 5:\n");
for(gen=0;gen<eranum;gen++)
{
ex5->f5();
ex5->intercross();
ex5->draw();

}


printf("按任意键继续:");
getch();

pmv=0.1;
ex2->setpm(pmv);
ex5->setpm(pmv);

printf("改变变异算子(pm=%f)\n",pmv);

printf("Fuction 2:\n");
for(gen=0;gen<eranum;gen++)
{
ex2->f2();
ex2->variation();
ex2->draw();

}

printf("按任意键继续:");
getch();

printf("Function 5:\n");
for(gen=0;gen<eranum;gen++)
{
ex5->f5();
ex5->variation();
ex5->draw();

}


printf("按任意键继续:");
getch();
}




...全文
121 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
WHQ 2000-05-28
  • 打赏
  • 举报
回复
initgraph(&gdriver,&gmode,"...\\bgi");的路径你写对了吗(至少这里是不对的)?而且你能保证在其它地方运行时,你的程序能找到相关的图形驱动程序(*.bgi)及字体(*.chr)吗?解决的办法有2:
1. 在initgraph中把路径设为空,并把你需要的图形驱动程序及字体文件从BC的BGI目录拷贝到你的可执行文件所在的目录;
2. 用registerXXX之类的函数(名字写的可能不对,已好多年没用过了),此时initgraph中的路径也为空,但你需要用bgi目录下的两个实用程序bgiobj,link? 把你用到的驱动程序及字体文件添加到graphics.lib中,详情可以参考TC2.0大全(北航出版过一本,600多页,16K)。
halfdream 2000-05-28
  • 打赏
  • 举报
回复
没错, 就是WHQ 说的那样。该说的全让WHQ说完了。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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