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

 一、什么是危房改造?

 1、农村危房是指年久失修,损坏严重对人们构成危险的宅基地,符合危房改造条件的都可以申请的到相应的补助。

 2、农村危房改造是我国实施农村脱贫攻坚工程的一项内容,由住房和城乡建设部、国家发改委、财政部共同策划,由各省市的住房和城乡建设部会同发改委、财政部门组织开展具体工作。

 二、2019年农村危房改造新政策

 在2018年11月,住房城乡建设部联合财政部印发《农村危房改造脱贫攻坚三年行动方案》,明确到2020年前完成,基本解决贫困户住房不安全问题。接下来一起看看具体有哪些重要政策内容。

 1、哪些房子属于农村危房?

 根据《农村危险房屋鉴定技术导则(试行)》鉴定属于整栋危房(D级)或局部危险(C级)的房屋就是危房,危房分为一级危房(D级)、二级危房(C1级)和三级危房(C2级),承重机构危险构件比例大于30%的为一级危房、在5%-3%之间的为二级危房、小于5%的为三级危房。

 一级危房:整体危险,需要拆除重新建设的房屋。

 二级危房:局部危险,仅对局部构件进行更换、维修,即可恢复正常使用。

 三级危房:有危险点,仅需要更换个别构件或轻微维修,即可恢复正常使用。

 ①地基基础:地基基础尚保持稳定,基础出现少量损坏;

 ②墙体:承重的墙体多数轻微裂缝或部分非承重墙墙体明显开裂,部分承重墙体明显位移和歪闪;非承重墙体普遍明显裂缝;部分山墙转角处和纵、横墙交接处有明显松动、脱闪现象;

 ③梁、柱:梁、柱出现裂缝,但未达到承载能力极限状态;个别梁柱节点破损和开裂明显。

 ④楼、屋盖:楼、屋盖显著开裂;楼、屋盖板与墙、梁搭接处有松动和明显裂缝,个别屋面板塌落。

 ①地基基础:地基基本失去稳定,基础出现局部或整体坍塌;

 ②墙体:承重墙有明显歪闪、局部酥碎或倒塌;墙角处和纵、横墙交接处普遍松动和开裂;非承重墙、女儿墙局部倒塌或严重开裂;

 ③梁、柱:梁、柱节点破坏严重;梁、柱普遍开裂;梁、柱有明显变形和位移;部分柱基座滑移严重,有歪闪和局部倒塌;

 ④楼、屋盖:楼、屋盖板普遍开裂,且部分严重开裂;楼、屋盖板与墙、梁搭接处有松动和严重裂缝,部分屋面板塌落;屋架歪闪,部分屋盖塌落。

 2、农村危房改造对象

 我国危房改造的重点对象有建档立卡贫困户、低保户、农村分散供养特困人员和贫困残疾人家庭4类重点对象,在危房改造时这几类人,需要经过政府对房屋危险程度进行评定,然后根据实际情况给出相应的补贴标准。

 3、危房改造建设标准

 拆除重建的房屋建筑面积,原则上1-3人户在40-60平米,1人户不低于20平米,2人户不低于30平米,C类危房可因地制宜开展维修加固或拆除重建,各地可根据当地民族习俗、气候特点等实际情况制定细化建设标准。

 4、危房改造补贴的主体

(1)领取危房改造的补贴对象

 ①就农村危房改造补贴的对象而言,其是针对农村贫困家庭的,其主要包括建档立卡贫困户、农村低保户、农村分散供养五保户、农村贫困残疾人家庭、或者农村其他贫困户等等。

 ②对于其他条件较好的家庭而言,其暂时是不符合危房改造补贴领取的条件的。此外已纳入异地扶贫搬迁计划的对象不得领取农村危房改造补贴。

 户主自愿持户口本、身份证、相关证明等向所在村委会提出申请,村两委研究决定具体对象并公示上报,经乡镇政府入户调查审核,合格后再报区级部门审批,批复后再次公示名单。组织对危房进行鉴定后方能进行合理的危房改造。

}

EOF是指文件的结束符,是一个宏定义
数量惊人的有用的代码。最简单的例子就是把输入一次一个字符地复制到输出,其基本思想

  • while (该字符不是文件结束指示符)

将上述基本思想转换为C语言程序为:


  

      字符在键盘、屏幕或其它的任何地方无论以什么形式表现,它在机器内部都是以位模式
存储的。char 类型专门用于存储这种字符型数据,当然任何整型(int)也可以用于存储字
符型数据。因为某些潜在的重要原因,我们在此使用int类型。
      这里需要解决如何区分文件中有效数据与输入结束符的问题。C语言采取的解决方法是:
在没有输入时,getchar 函数将返回一个特殊值,这个特殊值与任何实际字符都不同。这个
值称为EOF(end of file,文件结束)。我们在声明变量c 的时候,必须让它大到足以存
放getchar函数返回的任何值。这里之所以不把c声明成char类型,是因为它必须足够大,
除了能存储任何可能的字符外还要能存储文件结束符EOF。因此,我们将c声明成int类型。
EOF 定义在头文件<stdio.h>中,是个整型数,其具体数值是什么并不重要,只要它与
任何char类型的值都不相同即可。这里使用符号常量,可以确保程序不需要依赖于其对应的

之类的赋值操作是一个表达式,并且具有一个值,即赋值后左边变量保存的值。也就是说,
赋值可以作为更大的表达式的一部分出现。如果将为c赋值的操作放在while循环语句的测
试部分中,上述字符复制程序便可以改写成下列形式:


  

结束标志。如果该字符不是文件结束标志,则执行while语句体,并打印该字符。随后重复
执行while语句。当到达输入的结尾位置时,while循环语句终止执行,从而整个main函
整个程序看起来更紧凑。习惯这种风格后,读者就会发现按照这种方式编写的程序更易阅读。
我们经常会看到这种风格。(不过,如果我们过多地使用这种类型的复杂语句,编写的程序可
能会很难理解,应尽量避免这种情况。)
对while语句的条件部分来说,赋值表达式两边的圆括号不能省略。不等于运算符!=的
优先级比赋值运算符=的优先级要高,这样,在不使用圆括号的情况下关系测试!=将在赋值=
操作之前执行。因此语句

 

程序会读取字符,当有字符可读时,getchar() 不会返回文件结束符(EOF),所以 getchar() != EOF 的取值为真,变量 c 将被赋值为 1。当程序遇到文件结束符时,表达式取值为假,此时变量将被赋值为 0,程序将运行结束。

对于一个判断表达式,它的返回值会是一个布尔值。

2. 请编写一个打印 EOF 值的程序


  

在我们的系统中, EOF 被定义为 -1,但在其它系统中,EOF 可能被定义成其它的值。这正是使用 EOF 等标准符号常量能够增加程序可移植性的原因所在。

}

本篇核心讲解的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语言是一种非结构化程序设计语言 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信