1 简化字符串显示(harib10a)

昨天我们学习了不少提高定时器处理速度的内容,只是还没有学完。但如果新一章一开始就讲那么难的东西,反而会事倍功半,所以我们还是从简单的地方开始吧。

浏览一下harib09g的bootpack.c,大家会发现它居然有210行之长。这中间多次出现了如下内容:

  1. boxfill8(buf_back, binfo->scrnx, COL8_008484, 0, 16, 15, 31);
  2. putfonts8_asc(buf_back, binfo->scrnx, 0, 16, COL8_FFFFFF, s);
  3. sheet_refresh(sht_back, 0, 16, 16, 32);

这段程序要完成的是:先涂上背景色,再在上面写字符,最后完成刷新。既然这部分重复出现,我们就把它归纳到一个函数中,这样更方便使用。

  1. void putfonts8_asc_sht(struct SHEET *sht, int x, int y, int c, int b, char *s, int l)
  2. {
  3. boxfill8(sht->buf, sht->bxsize, b, x, y, x + l * 8 - 1, y + 15);
  4. putfonts8_asc(sht->buf, sht->bxsize, x, y, c, s);
  5. sheet_refresh(sht, x, y, x + l * 8, y + 16);
  6. return;
  7. }

在此补充说明一下变量的名称。

x, y …… 显示位置的坐标

  c …… 字符颜色(color)

  b …… 背景颜色(back color)

  s …… 字符串(string)

  l …… 字符串长度(length)

利用上面的函数,刚才的3行内容就可以简写成下面的1行了。

  1. putfonts8_asc_sht(sht_back, 0, 16, COL8_FFFFFF, COL8_008484, s, 2);

太好了!那我们就赶紧改写bootpack.c吧!

■■■■■

如果把修改的内容都列出来,就太长了,意义也不大,所以这次我们省略了。可是一点都不写的话,又有点说不过去,所以简单写个例子吧。

修改前

  1. boxfill8(buf_back, binfo->scrnx, COL8_008484, 32, 16, 32 + 15 * 8 - 1, 31);
  2. putfonts8_asc(buf_back, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
  3. sheet_refresh(sht_back, 32, 16, 32 + 15 * 8, 32);

修改后

  1. putfonts8_asc_sht(sht_back, 32, 16, COL8_FFFFFF, COL8_008484, s, 15);

修改后的bootpack.c只有208行,太好了!缩短了2行。

(可不要说“只缩短了2行呀”之类的哦)。运行“make run”确认一下吧。嗯,运行正常!