请各位高手帮我检查一下这个程序的错误

时间:2022-08-03 18:42:07
该程序的目的是在图形模式下显示汉字,能通过编译,但是点可执行文件便一闪而过

c程序如下:
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>

FILE  *fp;
char far *video=MK_FP(0xa000,0x0000);
void set_vmode(int mode)
{
union REGS r;
r.h.ah=0;
r.h.al=mode;
int86(0x10,&r,&r);
}
void openfile()
{
if((fp=fopen("D:\TURBOC2\Cprogram\hzk16","r"))==NULL)
{
printf("Can't Open File HZK16");
exit(1);
}
}
void closefile()
{
fclose(fp);
return;
}

int disp_word(unsigned char *word,int x,int y,int wd,int col)
{
register int k;
register p,page;
unsigned char cw[33];
char c[2];
unsigned long int quma,weima;
setcolor(col);
for(k=0;word[k]!='\0';k+=2)
{
if((word[k]&0x80)!=0)
{
         quma=word[k]-161;
weima=word[k+1]-161;
if(fseek(fp,(94*quma+weima)*32,SEEK_SET)!=0)
{
         printf("fseek call fail");
exit(-1);
}
fread(cw,32,1,fp);

for(page=0;page<15;page++)
         {
        p=80*(y+page)+x/8;
        if((x>=0)&&(x<=639))
        {
video[p]=cw[2*page];
video[p+1]=cw[2*page+1];
}
}
x=x+15+wd;
}
else
{
c[0]=word[k];
c[1]='\0';
outtextxy(x,y+4,c);
x=x+8+wd;k--;
}
         }
return 0;
}

int main()
{
set_vmode(18);
openfile();
disp_word("王",16,16,4,4);
closefile();
getch();
closegraph();
return 0;
}

5 个解决方案

#1


在DOS或者命令行下运行一下试试

#2


楼上说的可行

或者在 main函数的 return 0; 之前,加一句 getch();

#3


对我也就想到上面两种,getchar(),不用来回换。

#4


void openfile()
{
if((fp=fopen("D:\TURBOC2\Cprogram\hzk16","r"))==NULL)
{
printf("Can't Open File HZK16,press any key exit");
                  getch();
exit(1);
}
}
可能是没有文件D:\TURBOC2\Cprogram\hzk16


#5


楼主,我花了一个小时,帮你搞定。(分要送上哟!解释够详细吧:))
1、你的程序中没有图形模式的初始化;请在main()中开始部分加上下面的代码(然后按照3去做,这样就可以显示出“王”):
         int gdriver=DETECT,gmode;
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver, &gmode, "");

2、即便在程序中初始化了,如果没有进行相关设置.exe也是不能脱离TC环境运行。
3、你可以按下面的做法建立图形程序独立运行的环境。
    
    大家知道,C/C++语言提供了十分丰富的图形函数,图形函数文件为Graphics.h,使用图形函数前须先将屏幕设置为图形模式,C/C++语言提供了下面的函数:
  void far initgraph(int far *GD,int far *GM,char *P);
  其中,GD和GM分别表示图形驱动程序和图形模式,P指图形驱动程序所在的目录路径。
  图形驱动程序由Borland公司(对于Turbo C和Borland 
C++)提供,同时C/C++语言还提供了退出图形状态的函数closegraph(),格式为:
  void far closegraph(void);
  许你经常在用C/C++语言编写一些图形程序,但是总不能脱离C/C++语言环境独立运行,我们怎样来解决呢?
  能否建立一个不需要驱动程序和字体文件也能独立运行的图形程序呢?笔者经过实践,得到了肯定的答案,下面是实现图形程序独立运行的具体步骤:
  1.将驱动程序EGAVGA.BGI转换成目标文件EGAVGA.OBJ:
  C:\TC>BGIOBJ EGAVGA
  按同样的办法,将字体文件*.CHR转换成目标文件*.OBJ:
  C:\TC>BGIOBJ TRIP
  C:\TC>BGIOBJ LITT
  C:\TC>BGIOBJ SANS
  C:\TC>BGIOBJ GOTH
  2.将上述建立的OBJ文件加入到GRAPHICS.LIB库文件中,具体方法如下:
  C:\TC>TLINK C:\TC\LIB\GRAPHICS.LIB+EGAVGA
  C:\TC>TLINK C:\TC\LIB\GRAPHICS.LIB+TRIP
  C:\TC>TLINK C:\TC\LIB\GRAPHICS.LIB+LITT
  C:\TC>TLINK C:\TC\LIB\GRAPHICS.LIB+SANS
  C:\TC>TLINK C:\TC\LIB\GRAPHICS.LIB+GOTH
  也可以使用TLIB、PRJ程序代替TLINK。
  3.在程序中调用initgraph()函数前,应加上如下语句:
  registerbgidriver(EGAVGA-driver);
  它通知连接程序把EGAVGA驱动程序装入用户的执行程序中,同样在装入字体文件之前要加上如下语句:
  registerbgifont(字体文件名);
  4.通过上述处理后,编译连接后的执行程序就可以在任何目录下运行了。这时,将屏幕初始化为图形模式的函数可改写为:
  void InitGra(void)
  {int GD=DETECT,GM;
  registerbgidriver(EGAVGA_driver);
  registerbgifont(triplex_font);
  registerbgifont(small_font);
  registerbgifont(sansserif_font);
  registerbgifont(gothic_font);
  initgraph(&GD,&GM,"");
  }
  按照以上步骤,就能实现图形程序的独立运行。

#1


在DOS或者命令行下运行一下试试

#2


楼上说的可行

或者在 main函数的 return 0; 之前,加一句 getch();

#3


对我也就想到上面两种,getchar(),不用来回换。

#4


void openfile()
{
if((fp=fopen("D:\TURBOC2\Cprogram\hzk16","r"))==NULL)
{
printf("Can't Open File HZK16,press any key exit");
                  getch();
exit(1);
}
}
可能是没有文件D:\TURBOC2\Cprogram\hzk16


#5


楼主,我花了一个小时,帮你搞定。(分要送上哟!解释够详细吧:))
1、你的程序中没有图形模式的初始化;请在main()中开始部分加上下面的代码(然后按照3去做,这样就可以显示出“王”):
         int gdriver=DETECT,gmode;
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver, &gmode, "");

2、即便在程序中初始化了,如果没有进行相关设置.exe也是不能脱离TC环境运行。
3、你可以按下面的做法建立图形程序独立运行的环境。
    
    大家知道,C/C++语言提供了十分丰富的图形函数,图形函数文件为Graphics.h,使用图形函数前须先将屏幕设置为图形模式,C/C++语言提供了下面的函数:
  void far initgraph(int far *GD,int far *GM,char *P);
  其中,GD和GM分别表示图形驱动程序和图形模式,P指图形驱动程序所在的目录路径。
  图形驱动程序由Borland公司(对于Turbo C和Borland 
C++)提供,同时C/C++语言还提供了退出图形状态的函数closegraph(),格式为:
  void far closegraph(void);
  许你经常在用C/C++语言编写一些图形程序,但是总不能脱离C/C++语言环境独立运行,我们怎样来解决呢?
  能否建立一个不需要驱动程序和字体文件也能独立运行的图形程序呢?笔者经过实践,得到了肯定的答案,下面是实现图形程序独立运行的具体步骤:
  1.将驱动程序EGAVGA.BGI转换成目标文件EGAVGA.OBJ:
  C:\TC>BGIOBJ EGAVGA
  按同样的办法,将字体文件*.CHR转换成目标文件*.OBJ:
  C:\TC>BGIOBJ TRIP
  C:\TC>BGIOBJ LITT
  C:\TC>BGIOBJ SANS
  C:\TC>BGIOBJ GOTH
  2.将上述建立的OBJ文件加入到GRAPHICS.LIB库文件中,具体方法如下:
  C:\TC>TLINK C:\TC\LIB\GRAPHICS.LIB+EGAVGA
  C:\TC>TLINK C:\TC\LIB\GRAPHICS.LIB+TRIP
  C:\TC>TLINK C:\TC\LIB\GRAPHICS.LIB+LITT
  C:\TC>TLINK C:\TC\LIB\GRAPHICS.LIB+SANS
  C:\TC>TLINK C:\TC\LIB\GRAPHICS.LIB+GOTH
  也可以使用TLIB、PRJ程序代替TLINK。
  3.在程序中调用initgraph()函数前,应加上如下语句:
  registerbgidriver(EGAVGA-driver);
  它通知连接程序把EGAVGA驱动程序装入用户的执行程序中,同样在装入字体文件之前要加上如下语句:
  registerbgifont(字体文件名);
  4.通过上述处理后,编译连接后的执行程序就可以在任何目录下运行了。这时,将屏幕初始化为图形模式的函数可改写为:
  void InitGra(void)
  {int GD=DETECT,GM;
  registerbgidriver(EGAVGA_driver);
  registerbgifont(triplex_font);
  registerbgifont(small_font);
  registerbgifont(sansserif_font);
  registerbgifont(gothic_font);
  initgraph(&GD,&GM,"");
  }
  按照以上步骤,就能实现图形程序的独立运行。