打印

C 的面向对象化

[复制链接]
631|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dianz|  楼主 | 2016-1-31 17:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在面向对象的语言里面,出现了类的概念。类是对特定数据的特定操作的集合体。类包含了两个范畴:数据和操作。而 C 语言中的struct 仅仅是数据的集合,我们可以利用函数指针将struct 模拟为一个包含数据和操作的"类"。下面的C 程序模拟了一个最简单的"类":
沙发
dianz|  楼主 | 2016-1-31 17:22 | 只看该作者
#ifndef C_Class
#define C_Class struct
#endif
C_Class A   
{
  C_Class A *A_this; /* this指针 */
  void (*Foo)(C_Class A *A_this); /* 行为:函数指针 */
  int a; /*  数据 */
  int b;
};

使用特权

评论回复
板凳
dianz|  楼主 | 2016-1-31 17:25 | 只看该作者
我们可以利用C 语言模拟出面向对象的三个特性:封装、继承和多态,但是更多的时候,我们只是需要将数据与行为封装以解决软件结构混乱的问题。C 模拟面向对象思想的目的不在于模拟行为本身,而在于解决某些情况下使用 C 语言编程时程序整体框架结构分散、数据和函数脱节的问题。我们在后续章节会看到这样的例子。

使用特权

评论回复
地板
engao| | 2016-1-31 17:27 | 只看该作者
汉字处理

    现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉 字库,往往只是需要提供数量有限的汉字供必要的显示功能。例如,一个微波炉的LCD上没有必要提供显示"电子邮件"的功能;一个提供汉字显示功能的空调的LCD上不需要显示一条"短消息",诸如此类。但是一部手机、小灵通则通常需要包括较完整的汉字库。

使用特权

评论回复
5
dianz|  楼主 | 2016-1-31 17:27 | 只看该作者
如果包括的汉字库较完整,那么,由内码计算出汉字字模在库中的偏移是十分简单的:汉字库是按照区位的顺序排列的,前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。因此,汉字在汉字库中的具体位置计算公式为:94*( 区号-1)+ 位号-1 。减1 是因为数组是以0 为开始而区号位号是以1 为开始的。只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+ 位号-1)* 一个汉字字模占用字节数,以 16*16点阵字库为例,计算公式则:(94*(区号-1)+(位号-1))*32。汉字库中从该位置起的32字节信息记录了该字的字模信息。

使用特权

评论回复
6
engao| | 2016-1-31 17:27 | 只看该作者

    对于包含较完整汉字库的系统而言,我们可以以上述规则计算字模的位置。但是如果仅仅是提供少量汉字呢?譬如几十至几百个?最好的做法是:

使用特权

评论回复
7
engao| | 2016-1-31 17:28 | 只看该作者
定义宏:
# define EX_FONT_CHAR(value)   
# define EX_FONT_UNICODE_VAL(value) (value),
# define EX_FONT_ANSI_VAL(value) (value),

  定义结构体:
typedef struct _wide_unicode_font16x16   
{
  WORD value; /* 内码 */
  BYTE data [3 2]; /*  字模点阵 */
}Unicode;
#define CHINESE_CHAR_NUM … /*  汉字数量 */

使用特权

评论回复
8
dianz|  楼主 | 2016-1-31 17:28 | 只看该作者
字模的存储用数组:
Unicode chinese[CHINESE_CHAR_NUM] =
{
{
EX_FONT_CHAR(" 业")
EX_FONT_UNICODE_VAL(0x4e1a)
{0x04, 0x40, 0x04, 0x40, 0x04, 0x40, 0x04, 0x44, 0x44, 0x46, 0x24, 0x4c, 0x24, 0x48, 0x14,
0x50 , 0x1c, 0x50, 0x14, 0x60, 0x04, 0x40, 0x04, 0x40, 0x04, 0x44, 0xff, 0xfe, 0x00, 0x00,
0x00, 0x00}
},
{
EX_FONT_CHAR(" 中")
EX FONT UNICODE VAL( 0x4e2d)
{0x01, 0x00, 0x01, 0x00, 0x21, 0x08, 0x3f, 0xfc, 0x21, 0x08, 0x21, 0x08, 0x21, 0x08, 0x21,
0x08, 0x21, 0x08,   
0x3f, 0xf8, 0x21,  0x08, 0x01, 0x00, 0x01,  0x00, 0x01, 0x00, 0x 01, 0x00, 0x01, 0x00}
},

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

369

帖子

0

粉丝