"一种自动把汉字点阵嵌入程序的方法"


  本刊97年第2期刊发了谢玉辉老师的"一种自动把汉字点阵嵌入程序的方法"一文(以下简称"嵌入"),此文很巧妙将C语言源程序中的汉字点阵嵌入源程序中,确实如谢老师所说的"可使用应用程序脱离汉字库显示汉字,而且显示速度很快,实用性和通用性较好"。下面笔者,就此文介绍的方法作进一步扩充,让你的应用程序真正能做到"实用性和通用性都较好",算是以此抛砖引玉。

一、几点改进意见

  为了能使用户的应用程序能脱离中文环境显示汉字,"嵌入"一文将用户C语言源程序中的汉字均视为西文方式下要显示的汉字,将它们的点阵信息取出后放入hzk.dat文件定义的数组hzk中,这不仅显得有些牵强,而且非常不切合实际。如下述一段程序:

  .....
  printf("没有什么可以比这好"); /*显示字符串*/
  ...

  以上源程序中,虽然用到了汉字,但没有一个汉字是要在西文图形方式下显示的字串,因此没有必要将它们嵌入hzk.dat文件中。这也正如谢老师所说"为了节约空间","扫描前可去掉源程序中的汉字注释"。其实我们通常显示的字串都用双引号将它们括起来(程序执行时,动态改变的字串和格式化字串除外),因此我们一般只要对双引号中的汉字进行扫描即可,没有必要去扫描注释中的汉字,也没必要"去掉源程序中的汉字注释"。当然,这样做又给我们出以一道难题:并不是所有双引号中的汉字都进行扫描的。为了解决这一问题,笔者认为在字串中设置标志是一种较好的解决方法。在此,笔者作如下设定:想在西文图形方式下显示的字串前用"@"字符前缀说明,不用的则不必要说明。

  如:

  printf("我叫江龙,74年8月出生");
  .....
  Show("@我原毕业于湖北沙洋师范学校小教数学专业");
  .....
  则程序便很容易区分某一字串的扫描与否。当然若用户不需要扫描的字符串第一个字符为"@",则书写式要加入"弊址par 这样一来,以上问题便较好的解决了。但另一个问题又出现了,在书写注释时,用户应该避免有""@"这样的字串,因为程序在扫描中,是对""@"进行的(若一定要出现,请在前面加上"@"字符串出现的,因为它们通常前面加上了""@"printf("12,23 say @12,32")。

  另外,"嵌入"一文,将程序中所用的汉字建立在index.dat文件中index数组中,这是一种解决检索汉字的方法,但这种方法会因为汉字的增多,而显得不可提倡。一般来说,有100个汉字索引表,为了查询某一汉字(顺序查找),平均每查一个汉字需要50次,若增加到1000个,则需要500次。这不仅浪费大量CPU时间,而且因为索引表的存在,占据了一定空间,使得生成的可执行文件太大。因此若一次性查找定位,而且不建立索引表,将是一种值得提倡的方法。笔者在"文本文件生成器TTE的制作方法"(刊于97年第4期《电脑编程技巧与维护》)一文中介绍的重新修改汉字机内码已作了说明,限于篇幅,不再复述,读者可参阅上术文章。

二、使用注意事项

  下面为笔者对"嵌入"一文作的扩充程序,用Turbo C 2.0编写而成,在配有VGA显示卡的X86机中通过。

几点说明如下:

  1、请将要显示的字串前用"@"字符说明,并用下列函数调用:
  void ShowString(int x,int y,              /*显示的坐标*/
  unsigned char *s,          /* 字符串*/
  char forecolor,char bkcolor)  /*前、背景色*/

  如,用户在C语言源程序中有如下的程序段:

  #include <conio.h>
  #include <dos.h>
  void  SetShowMode(int mode) /*设置显示模式*/;
  main()
  int i;
  char *text[2]="@我是中国人",
  "@imde没有什么可以";
  printf("wellcome use if.");
  SetShowMode(0x12);
  for(i=0;i<2;i++)
  	        ShowString(100,(i+2)*18,text[i],RED,BLUE);
  getch();
  SetShowMode(3);
  
  void  SetShowMode(int mode) /*设置显示模式*/
  union REGS r;
  r.h.al=mode;
  r.h.ah=0;
  int86(0x10,&r,&r);

   则text字串,将会自动转换成图形方式下的字串;而没有加"@"字符的字串,将不会转换,如上述的"wellcome use if."。若用户不想转换的字符串第一个字符为"@",可在前加上"即可。

2、程序使用方法

  ⑴、在DOS下先将源程序转换成要求的C源程序

  HHC <用户C语言源程序> <目的C语言源程序>

  此时,会在用户目录下建立一个useword.dat文件(汉字字模和ASC字模数据文件)其变量说明如下:

  __AscMode__[][16] /*所用的ASCII字模数据*/

  __WordMode__[][32] /*所用的汉字字模数据*/

  ⑵、在TC环境下编译、连接<目的C语言源程序>或直接在DOS下用tcc编译连接。

  tcc <目的C语言源程序>

  生成的exe文件即可直接在西文图形方式下运行。

  3、注意事项:

  ⑴、用户在调用ShowString()函数前,一定要将屏幕设置成图形方式(本程序需要VGA显示卡支持才能使用,若用户使用的显示器不为VGA,可对程序ShowHz.c进行修改)。

  ⑵、显示字符串函数请用ShowString(),若用户使用的函数与此相近,请用define定义,如用户使用的函数为show(),则可在生成的目的源程序中,加入如下语句:\par #define show(....) ShowString(x,y,string,color,bkcolor)

  ("..."表示如此对应的参数)。

发表评论】 【评论查看】 【推荐于友】 【打印本页】 【关闭窗口