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

给小弟帮帮忙,该怎么解决

2012-04-19 
给小弟帮帮忙这段画图程序是书上写的,动态的图,但是运行后啥都不显示,那里有问题?请高手帮帮忙!#include

给小弟帮帮忙
这段画图程序是书上写的,动态的图,但是运行后啥都不显示,那里有问题?请高手帮帮忙! 


#include "stdio.h" 
#include "dir.h" 
#include "dos.h" 
#include "graphics.h" 

char *malloc();/*malloc转换*/ 

char bmp_to_dat(char *bmp,char *dat) 
/*将16色BMP文件转换为可以用putimage输出的格式,bmp为原BMP文件,dat为转化文件*/ 

unsigned char c[8],scan_times,scan_pixs; 
unsigned char workpos;int i,j,k,n,nowpos,iw,ih; 
static int color[16]={0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15}; 
unsigned char workline[640],scanline[640]; 
FILE *fp,*targetfp; 
union 

unsigned char value; 
struct 

unsigned cl:4; 
unsigned ch:4; 
}color; 
}mycolor; 

if((fp=fopen(bmp,"rb"))==NULL)return(0); 
targetfp=fopen(dat,"wb"); 

fseek(fp,18,SEEK_SET); 
iw=0;ih=0; 
fread(&iw,4,1,fp); /*读图像宽度*/ 
fread(&ih,4,1,fp); /*读图像高度*/ 
if(iw==0&&ih==0&&iw>640&&ih>480) 
{fclose(fp);fclose(targetfp);return(0);} 

iw--;ih--; /*∵putimage中的长宽比实际数值少1*/ 
scan_times=iw/8+1; /*行处理单位数*/ 
scan_pixs=scan_times*4; /*行像素字节数∵1单位=4字节*/ 

fputc(iw%256,targetfp); /*填充信息头:长、宽部分*/ 
fputc(iw/256,targetfp); 
fputc(ih%256,targetfp); 
fputc(ih/256,targetfp); 
fseek(fp,-scan_pixs,SEEK_END); 

for(j=0;j <=ih;j++) 
{nowpos=0; 
fread(scanline,scan_pixs,1,fp); 
fseek(fp,-scan_pixs*2,SEEK_CUR); 
for(n=3;n>=0;n--) /*解码4个位面*/ 
{for(i=0;i <scan_times;i++) /*解码各编码单位*/ 
{workpos=0; 
  for(k=0;k <4;k++) /*分离出8个像素*/ 
  {mycolor.value=scanline[i*4+k]; 
c[k*2]=color[mycolor.color.ch]; 
c[k*2+1]=color[mycolor.color.cl]; 
  } 
  for(k=0;k <8;k++)workpos+=(c[k]>>n&1) < <(7-k); 
  workline[nowpos]=workpos;nowpos++; 
}} 
fwrite(workline,scan_pixs,1,targetfp); 

fclose(fp);fclose(targetfp); 
return(1); 


main() 

int gd=VGA,gm=VGAHI,n; 
char *buffer,bmpfile[13],_16file[13]={0}; 
FILE *fp; 
struct ffblk *ff; 
/*registerbgidriver(EGAVGA_driver);*/ 
initgraph(&gd,&gm,"C:\\tc"); 
printf("Now start to display 16 color bmp.\n\n"); 
puts("Please choice: "); 
printf("0. Quit \n1. BMP file name\n"); 
while(1) 

n=getch(); 
switch(n) 

case 0 :continue; 
case '0':exit(0); 
case '1': 

printf("Please input BMP file name(*.bmp):"); 
gets(bmpfile); 
goto OUT; 



OUT: 
strncpy(_16file,bmpfile,strlen(bmpfile)-3); 
strcat(_16file,"dat"); 
if(!bmp_to_dat(bmpfile,_16file)) 

puts("Can't open file!"); 
closegraph(); 
exit(0); 

fp=fopen(_16file,"rb"); 
findfirst(_16file,ff,FA_ARCH); 
if((buffer=malloc(ff->ff_fsize))==NULL)exit(0); 
n=0; 
while(!feof(fp)) 

buffer[n]=fgetc(fp); 
n++; 

for(n=0;n <100;n++) 

putimage(350-n,n/2,buffer,COPY_PUT); 

getch(); 
closegraph(); 
free(buffer); 
fclose(fp); 
} 
这是一段动态的画图程序!请大家帮帮忙!!!!!!!!

------解决方案--------------------


看来你用的还是boland 的 tc。据我了解,用Turbo C的图形函数库需要与图形库graphics.lib连接。
你可以在编译的时候敲tcc youfile.c graphics.lib
如果你建了工程,也可以在your.PRJ文件中加入一行 youfile graphics.lib
initgraph函数要把图形驱动装入内存,图形驱动包含在*.BGI文件中,且必须是你的系统下面可用的。根据你指定的路径"C:\\tc",请检查下这个路径下有没有BGI文件。
另外,你的程序中gd=VGA,gm=VGAHI,指定的显示驱动和640×480分辨率模式确实有点老了,不知道管用不。

完了,说句题外话:我也是从TC过来的,但我对TC用得不久,所以对它也没有什么好感。我实在不知道为什么还有这么多人愿意从TC这个老古董入门学C。你花那么多精力去熟悉tc的库、非标准的扩展、dos下的图形库,对今天来说有什么意义?
[解决办法]
你的程序在win-tc下能通过编译并且运行,你的程序没有显示还是因为没有将graphice.lib集成进去。
[解决办法]
下次麻烦用以下的方式发送上来,你那样发看着累

C/C++ code
#include "stdio.h"  #include "dir.h"  #include "dos.h"  #include "graphics.h"  char *malloc();/*malloc转换*/  char bmp_to_dat(char *bmp,char *dat)  /*将16色BMP文件转换为可以用putimage输出的格式,bmp为原BMP文件,dat为转化文件*/  {  unsigned char c[8],scan_times,scan_pixs;  unsigned char workpos;int i,j,k,n,nowpos,iw,ih;  static int color[16]={0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15};  unsigned char workline[640],scanline[640];  FILE *fp,*targetfp;  union  {  unsigned char value;  struct  {  unsigned cl:4;  unsigned ch:4;  }color;  }mycolor;  if((fp=fopen(bmp,"rb"))==NULL)return(0);  targetfp=fopen(dat,"wb");  fseek(fp,18,SEEK_SET);  iw=0;ih=0;  fread(&iw,4,1,fp); /*读图像宽度*/  fread(&ih,4,1,fp); /*读图像高度*/  if(iw==0&&ih==0&&iw>640&&ih>480)  {fclose(fp);fclose(targetfp);return(0);}  iw--;ih--; /*∵putimage中的长宽比实际数值少1*/  scan_times=iw/8+1; /*行处理单位数*/  scan_pixs=scan_times*4; /*行像素字节数∵1单位=4字节*/  fputc(iw%256,targetfp); /*填充信息头:长、宽部分*/  fputc(iw/256,targetfp);  fputc(ih%256,targetfp);  fputc(ih/256,targetfp);  fseek(fp,-scan_pixs,SEEK_END);  for(j=0;j  <=ih;j++)  {nowpos=0;  fread(scanline,scan_pixs,1,fp);  fseek(fp,-scan_pixs*2,SEEK_CUR);  for(n=3;n>=0;n--) /*解码4个位面*/  {for(i=0;i  <scan_times;i++) /*解码各编码单位*/  {workpos=0;      for(k=0;k  <4;k++) /*分离出8个像素*/      {mycolor.value=scanline[i*4+k];  c[k*2]=color[mycolor.color.ch];  c[k*2+1]=color[mycolor.color.cl];      }      for(k=0;k  <8;k++)workpos+=(c[k]>>n&1)  <  <(7-k);      workline[nowpos]=workpos;nowpos++;  }}  fwrite(workline,scan_pixs,1,targetfp);  }  fclose(fp);fclose(targetfp);  return(1);  }  main()  {  int gd=VGA,gm=VGAHI,n;  char *buffer,bmpfile[13],_16file[13]={0};  FILE *fp;  struct ffblk *ff;  /*registerbgidriver(EGAVGA_driver);*/  initgraph(&gd,&gm,"C:\\tc");  printf("Now start to display 16 color bmp.\n\n");  puts("Please choice: ");  printf("0. Quit \n1. BMP file name\n");  while(1)  {  n=getch();  switch(n)  {  case 0  :continue;  case '0':exit(0);  case '1':  {  printf("Please input BMP file name(*.bmp):");  gets(bmpfile);  goto OUT;  }  }  }  OUT:  strncpy(_16file,bmpfile,strlen(bmpfile)-3);  strcat(_16file,"dat");  if(!bmp_to_dat(bmpfile,_16file))  {  puts("Can't open file!");  closegraph();  exit(0);  }  fp=fopen(_16file,"rb");  findfirst(_16file,ff,FA_ARCH);  if((buffer=malloc(ff->ff_fsize))==NULL)exit(0);  n=0;  while(!feof(fp))  {  buffer[n]=fgetc(fp);  n++;  }  for(n=0;n  <100;n++)  {  putimage(350-n,n/2,buffer,COPY_PUT);  }  getch();  closegraph();  free(buffer);  fclose(fp);  } 

热点排行