解读一下这个cc语言是一种非结构化程序设计语言?

  在C语言中,对结构体的访问一般有两种常规方式:"."访问和"->"访问。那么两者有什么区别呢?对C语言有一定了解的同学应该知道,我们新建一个结构体的时候,实际上就是新建了一种数据类型(比如int,char,double都是一种数据类型,只不过这些是C语言自带的数据类型),这是一种什么类型呢?其实,这种结构体的类型就是你命名的类型,譬如下面程序中,我定义的一种结构体:

在这个结构体中,我们定义的就是一种名字为xing的新数据类型。首先让我们利用这个新定义出来的数据类型去定义一些变量(包括普通变量和指针变量)

是不是觉得这样定义怪怪的,其实你觉得怪只是因为你习惯了看int或者double这种常规的数据类型而已,你可以想象一下,如何把上图中的"xing"型结构体类型换成"int chen;int * ting;"就好看多了?习惯而已,的学会适应。

好了,那我们接下来应该去讨论怎么去访问这个数据类型了又或者说是怎么访问这个结构体。

  方法一:采用"."去访问结构体里面的数据。如果我们在使用这个新的数据类型去定义普通变量时,那么我们去初始化这个结构体的元素和读取这个结构体的元素时就应该使用"."去访问。具体的形式如下:

  方法二:采用"->"去访问结构体里面的数据。我们目前知道,除了普通变量,我们还有指针变量。如果说我们使用这个新的数据类型去定义的是指针变量的话,那么我们去访问(初始化和读取数据)这个结构体的时候就应该采用"->"去访问。具体的形式如下:

常规的访问结构体的方法就是这两种了。还有其他方法,我们后续再讨论,下面是我的完整测试程序:

1. 诺基亚行货手机验证网址:

2.诺基亚原装电池验证网址:

6. 诺基亚6120c是3G手机,在国内可以使用吗?
不可以。因为诺基亚6120c的3G功能是WCDMA标准,国内的3G功能是TD-SCDMA标准,两者不通用,并且国内尚未正式开通3G网络,只是在个别城市试运行。

7. 诺基亚6120c的壁纸是否可以全屏?
不可以,S60系列的手机壁纸都不可以全屏。如果要全屏,除非制作主题文件。

9. 诺基亚6120c可以安装什么格式的程序?
sisx格式,部分sis格式,jar格式。

10. 为什么安装了jar程序却打不开?
jar文件名必须是英文或者数字,如果你下载后把名字改成了汉字的,安装之后就打不开,需要改成英文或数字。

11. 为什么我安装的软件找不到?
新安装的程序都放在了 应用程序\我的助理文件夹里,可以移动到别的地方。

6120c不是拍照手机,拍照效果比较差,并且屏幕有泛红现象,如果有了新版本升级之后还不能解决,就说明是摄像头的质量问题了。

6120c的音质属于普通水平,不如N73,5700,E2,E6,E398,外放声音不是很大,外放效果也一般化。

6120c内置了GPS功能,但是没有内置GPS卫星接收器,所以不能使用。如果要使用,需要购买GPS卫星蓝牙接收器。

15. 将6120c和电脑连接之后提示安装驱动,应该怎么办?
可以先安装诺基亚PC套件,最新版本是6.84,套件含有驱动程序,能够自动识别安装。

16. 安装主题时,提示证书已过期,应该怎么办?
将手机时间调至2006年即可。

17. 安装主题时,提示证书无效,或者证书限制,应该怎么办?
需要用证书重新给所要安装的软件签名。

18. 我不会制作证书怎么办?
由于塞班网停止了新用户注册,所以如果要制作证书,需要请教有塞班帐号的一些老手,现在有很多人提供义务制作证书的服务,大家可以向他们求救,制作证书需要你的手机串号,即IMEI号,可以通过使用*#06#查到,还需要你的手机型号,即诺基亚6120c。

6120c目前有两个版本,3.70的版本比较早,可以使用NSS更改CODE,然后升级,3.83版本比较新,无法被NSS软件识别,无法更改CODE。

21. 6120c可以使用视频来电铃声吗?
可以,支持3GP格式和MP4格式的视频铃声,但是不支持rm格式。

24. 可以更换手机的字体吗?
可以,需要安装软件FontRouter.LT.for.v9,该软件需要签名,安装完毕后需要在存储卡中建立一个文件夹E:\resource\Fonts,然后将字体复制到这个文件夹里面,另外还需要在存储卡根目录建一个FontRouter.ini文件,文件的内容如下:

然后重启手机,字体即可改变。
删除FontRouter或字体文件或移除FontRouter.ini配置文件,则字体会恢复成原来的。

25. 诺基亚6120c支持重复闹铃吗?
不仅支持,还支持多个闹铃,设置闹铃的时候可以选择“每天”,那么闹铃会在每天的这个时候响,也可以选择“每周”,比如每周三上午6点,还可以定义工作日闹铃,先将工作日的日期定好,然后将闹铃重复选项中选中工作日,比如每周一到周五上午6点,而周六和周日就不响了,当然我们也可以定义一次性闹铃,只要选中“不重复”就可以。

26. 诺基亚6120c观看视频是否可以全屏和快进?
可以的。播放视频时按数字键“2”可以在全屏模式和正常模式之间进行切换;在非全屏模式下,按导航键“上“可以快进,按导航键“下”可以快退。

27. 诺基亚6120c如何一键切换到静音模式?
按住#号键不放,即可在静音模式和标准模式之间进行切换。

28. 如何取出手机存储卡?
不要直接把卡拔除,可以先按一下关机键,在弹出的菜单中选择最后一项”取出内存卡“,然后按确定,再把卡取出来。

29. 诺基亚6120c有没有重启键?
有一种办法可以重启手机,按住#号键0.5秒不放,然后按一下*号键,松开这两个键,手机重启并切换到无声模式。

30. 安装了许多软件和主题,想删除几个,但是在“程序管理”里面找不到,怎么办?
程序管理里面显示的程序或主题数量是有限的,多了就无法显示了,删除其中的几个便可以将剩余的显示出来。另外,如果主题安装到了内存卡上,可以到内存卡的Private\\import目录下,将主题文件删除,每个主题放在单独的文件夹里。

31. 诺基亚6120c如何能够省电?
以下几种办法能在一定程度上节省电量:把主题文件和铃声安装到手机内存,减少对内存卡的读取;把网络模式由默认的UMTS和GSM双模式改为GSM模式;用进程管理软件关闭多余的进程;将背光时间调低些。

32. 发短信时,如何切换大小写?
按一下*号键,在弹出的菜单中选择“大写拉丁”或“小写拉丁“。

本篇核心讲解的2个图,如下所示。图1是官网文档中的设备各类关系图,图2是IO设备框架图,它们两个都取自rtt官方文档
图1 rtt设备各类关系图

本篇以面向对象的角度来解读rtt的IO设备框架。
先澄清下概念,这些概念是进行新的定义或者表达名词在本文中的意思,防止有二义。然后介绍各类关系,IO设备框架对应的类。再接着用伪代码举出了面向对象语言的对象创建与初始化,然后开始解读rtt的c的面向对象的对象创建及其启动初始化流程,最后总结面向对象语言与c面向对象的区别。

(1)以面向对象的角度表达自己对rtt设备框架的理解
(2)给框图找朋友。这个找朋友就像划线一样,记录下自己的牵线过程——把图1与图2的层次进行对应、划线,然后再给它们找对应的源代码——每个层次每类大致对应的c和h文件。不至于说看了这个不知道各层对应的c和h文件在哪。
(3)是我对官方IO设备框架文档的阅读笔记。——把抽象的rtt设备框架变成具体的——怎么具体?把IO框架层次对应到各c文件,使得官方设备框架文档不再那么抽象。

子类设备类 :设备基类派生出的子类。比如上面图1最下层的串口设备类、PIN设备类、SPI设备类、I2C总线设备类等类。

子类设备对象 :由子类设备类创建的对象。比如图1最下层的串口设备类等类创建的对象。

多态 :不同子类(同一父类派生出的各子类)调用同一父类方法时的表现不一样是为多态。——多态出现的根因在于,子类可以覆盖父类的方法或者拓展父类的方法,从而不同子类调用同一父类的方法时表现不同。在此重点列出

2 rtt的设备各类关系图与IO设备框架的对应

2.1 rtt的设备各类关系图
如图1,从上往下看依次是基类、设备基类、子类设备类。
从上往下看是派生的关系;
从下往上看,是继承关系。——这是面向对象的思想。

图3 IO设备框架分层

如图3,官方的设备框架层从上往下共5层——第0-第4层。

最上层第4层应用app。

第1层设备驱动层,实际上可以叫设备框架对接层
对接rtt的设备框架——需要客户以芯片厂家sdk(比如stm32的hal库)为基础写出对接接口,实质就是创建子类设备对象以及调用设备框架的启动入口——注册子类设备对象的函数(比如rt_hw_serial_register)。
另外,这层有些芯片平台的rtt已写好,比如stm32。

第0层 .硬件层。比如stm32芯片。

(1)第2-3层是rtt的IO设备对象框架层——rtt官方已写好,只需写好第1层。
(2)第1-3层实现了rtt对象的创建与初始化等面向对象语言创建对象的机制。
(3)rtt已经分好类并创建好类了,我们要做的事,只是拿rtt创建好的类来创建对象并启动对象初始化流程——这就是第1层要干的事。

2.2 rtt的设备各类关系图与IO设备框架的对应


图4 rtt的设备各类关系图与IO设备框架的对应

自己连线如如图4所示:
基类、设备基类对应IO设备框架的第3层I/O设备管理层(device.c、object.c)。

这样的话,把各层对应的c文件找出来从抽象来到具体。

3 面向对象语言创建对象
既然以面向对象的思想看rtt那么就说下面向对象的一些东西。
不管是面向对象语言还是c面向对象,其对象创建很相似,分两步:第一步,创建类,第二步创建对象并初始化对象。只是两者形式不同。

面向对象语言的创建对象、继承父类,写代码很简单,而c面向对象则需要把这一套机制给实现。

4 rtt的对象创建与初始化过程
c面向对象,创建对象需要解决的问题:
(1)怎么初始化对象的属性和方法?
(2)怎么继承父类的属性和方法?
这个问题面向对象语言不需要程序员自己解决,面向对象语言它自身有这个机制,而因为c面向对象方法的实现在外部,所以必须得把这一套机制实现下——实现对对象的初始化、继承等管理接口——以解决上面问题。
而rtt做了一套对象初始化的接口来实现了面向对象语言创建对象的那套机制——先创建对象,然后从低层到高层,实现了对对象方法、属性、父类方法和父类属性继承等的初始化。

如图1所示,大多数类,rtt已创建完成,我们所做的是拿rtt创建好的类去创建所需的对象得了——当然你也可以再派生出新类。
这些类在哪创建的呢?基类、设备基类、定时器类、线程类、ipc基类、ipc各子类(信号量类、互斥量类、邮箱类、消息队列类等)等类在rtdef.h中定义。
rtt的整体类关系图,如图5,取自官方文档内核基础:
图5 官方整体的大类关系图

而本篇解读的只是图5中设备类这一分支,但以点攻面,其他类似。

然后接着说图1的子类设备类在哪定义的?比如sensor设备类、PIN设备类分别在sensor.h、pin.h中定义的,其他子类设备同理。
这就是rtt已经写好的类——当然可以根据需求派生出新类。

4.2 rtt创建对象并初始化

以IO设备框架图为参照,从第1层为开始、为起点的,直至第3层为结束——是从底层到高层的过程——其初始化流程如下:

第1层 ,起点层,IO框架图中的rtt设备驱动层,我想了下也可叫rtt设备框架对接层。此层是拿rtt创建好的类来创建子类设备对象或者自己派生出新类创建子类设备类子类的对象,调用子类设备对象注册函数传递驱动的属性和方法到上一层——第2层,从而启动对象的初始化流程——所以说此层是子类设备对象初始化的推送者也是起点与开端。
此层的工作量在于编写子类设备对象的属性和方法。——这就需要编写硬件的能力——硬件驱动了。

第2层 ,设备驱动框架层,对应到图1类图的类是子类设备类,所做的事:
(1)初始化子类设备对象的属性和方法
(2)初始化子类设备对象的父类(设备基类)的属性和方法——其中,对父类方法的“继承”是通过函数指针重新映射的——这也是多态的体现(子类调用同一父类的方法表现不同)。

第3层 ,IO设备管理层,对应到图1类图的类是设备基类,这层按照顺序做了2件事:
(1)对子类设备的父类(设备基类)的属性进行初始化,并调用基类对象注册函数。
(2)初始化子类设备对象的父类的父类对象——即基类对象——并放到内核对象容器对应类型的链表中进行管理。

小结 :rtt是以IO框架图的第1层为起点,创建对象并启动对象初始化,然后第2-3层是实现对象的初始化,同时对应到类图,可以参看图1和图2,或者图4.

5 rtt的c面向对象与面向对象语言总结

第1-3层是rtt子类设备对象初始化过程——比如串口设备对象初始化过程,初始化过程是从低层到高层的过程——告诉上层底层硬件有什么能力,同时这一过程也体现了面向对象的三大特性:

(1)封装性:把属性和方法封装到各自的类中。 (2)继承的特性:子类继承了父类的属性与方法 (3)多态的特性:子类继承父类的方法是通过指针实现了对父类方法的重映射或者说修改,从而实现了多态的特性——子类调用同一父类的方法而表现不同。

5.2 c面向对象与面向面向对象语言的区别

c面向对象 : (1)不管子类还是父类的方法都是在外部实现的,通过指针“继承”过来。 (2)对父类方法的继承是对父类方法的重写:正是因为c面向对象的方法是在外部实现的,子类对父类方法的继承实质是通过指针指向不同的函数——不同子类给其父类链接的函数不同,所以对父类方法继承是对父类方法的重写,不存在对父类方法的拓展这一说。

面向对象的语言 : (1)子类、父类方法的实现都是封装在类的内部,在类的内部实现的。 (2)子类可以对父类的方法进行重写或者拓展以实现多态的特性——正是因为它们的方法是在类的内部实现而不是在外部实现的,所以子类可以对父类的方法进行重写或者拓展。

所以给我的感觉c面向对象和面向对象的语言最大不同是方法的实现不同,一个在类的外部实现,一个在类的内部实现,这就导致了c面向对象对父类方法的继承只能重写、不能拓展,而面向对象的语言除了重写父类方法的能力外,还比c面向对象要多出拓展父类方法这个能力。

我要回帖

更多关于 c语言是一种非结构化程序设计语言 的文章

 

随机推荐