浅谈面向对象思想下的 C 语言

如何使用OO思维方式

面向对象(object Oriented,简称:OO)在于用“找对象”的方式去规划和描述问题。

一、怎样“找对象” (思维过程)

“对象”是具有共性的一个群体。以 L298N 控制马达的官方推荐方法为例,控制的共性在于:每个马达都需要 2 个 GPIO 来控制转向,1 路 PWM 来控制转速。不妨如下定义马达这个群体:

马达
{2 个控制转向的 GPIO;  1 路控制转速的 PWM;
};  

二、怎样“用 C 语言找对象”(思维到代码的过程)

一个车有四个马达,每个马达独立控制。要完成这个控制目标,需要把“马达”在程序里实例化,造出四个互不干涉的实例来。

1、把思维变成 C 语言的过程

说到“实例化”就想到了 C 语言里的“结构体”,所以上面的定义变为:

struct 马达
{uint16_t 2个_控制转向的 GPIO;  uint8_t  1路_控制转速的 PWM;
};

为了使用的时候少打点关键字、省点力,我们引入 typedef 关键字,如下:

typedef struct 马达
{uint16_t 2个_控制转向的 GPIO;  uint8_t  1路_控制转速的 PWM;
} 马达;

通常把结构体定义在头文件里,所以:

// motor.h 头文件内容#ifndef __MOTOR_H__#define __MOTOR_H__
#include
typedef struct stm32_motor{  // 2个_控制转向的 GPIO;  GPIO_TypeDef      *dir_port;  uint16_t          pin_1;  uint16_t          pin_2;// 1路_控制转速的 PWM;  TIM_HandleTypeDef  *tim;  uint8_t            channel;} stm32_motor;#endif /* __MOTOR_H__ */

为了易懂,Sugar 这里直接使用 CubeMX 生成的 HAL 库 API,不加入操作系统。这里涉及两个小知识点:如何使用 GPIO 点亮 LED、如何使用定时器产生 PWM。不懂的读者可以网上搜一下,大把大把的教程。

2、对象实例化

以上完成了“对象的抽象过程”,使用的就是面象对向的思维方式。直至目前相当于计划有了,下面就要落实。对象的实例化在 C 语言里就是:用结构体定义变量,如下:

// motor.c 源文件内容#include "motor.h"
extern TIM_HandleTypeDef htim5;
static stm32_motor motor_1 = {GPIOC,                              GPIO_PIN_1,                              GPIO_PIN_3,                              &htim5,                              TIM_CHANNEL_4};static stm32_motor motor_2 = {GPIOE,                              GPIO_PIN_2,                              GPIO_PIN_4,                              &htim5,                              TIM_CHANNEL_1};static stm32_motor motor_3 = {GPIOE,                              GPIO_PIN_3,                              GPIO_PIN_5,                              &htim5,                              TIM_CHANNEL_2};static stm32_motor motor_4 = {GPIOC,                              GPIO_PIN_0,                              GPIO_PIN_2,                              &htim5,                              TIM_CHANNEL_3};

至此,可以看到面向对象思想就是对目标进行归类划分的思想。上面把“马达”抽象成一个有共性的群体,这样的操作在 C 里就是“类的划分过程”。

在 ArduPilot 开源飞控中,Libraries 库里都是 C 的类。在了解上面所述的面向对象思想后,可以发现 Libraries 里那么多的代码基本就是四种对象:
(1) 具体的硬件对象,这与本例所述的马达类似,比如:AP_Baro、AP_GPS等;
(2) 一整套有明确功能的算法对象,比如:AC_AttitudeControl、AC_WPNav、AP_NavEKF2等;
(3) 硬件平台对象,这里说的是:AP_HAL 及其子类;
(4) 基本数学方法对象,Sugar 在麦轮车上就移出了 ArduPilot 的 AP_Math 基本数学方法库。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的世界服务器里怎么无限随机传送,我的世界随机传送插件使用教程 权限指令分享...

导读:在我的世界中玩家可以利用随机传送插件来进行传送人物质与设定点,那么随意传送插件该如何使用呢、下面小编我就来教教各位,我的世界随意传送插件使用教程。什么是RandomLocationRandomLocation让你传送到预设区域的随机位置。可以通过命…

热敏电阻温度特性曲线_NTC热敏电阻如何选型

什么是NTCNTC 热敏电阻是负温度系数的电阻,其特性是电阻值随着温度的升高而呈下降趋势。这个与PTC或者PT100等正温度系数的热敏电阻相反。NTC 热敏电阻NTC的阻值-温度对应曲线如下图所示(100K为例,B值3950)。NTC 热敏电阻R-T曲线下面介绍选型原则。2.根据…

如何使用C语言的面向对象?

我们都知道,C 才是面向对象的语言,但是C语言是否能使用面向对象的功能?(1)继承性typedef struct _parent{int data_parent;}Parent;typedef struct _Child{struct _parent parent;int data_child;}Child;在设计C语言继承性的时候,我们需要做…

t3软件怎么生成报表_临沂用友畅捷通T3财务通软件财税一体化

用友T3财税通针对财税一体化的发展趋势,在用友通上海财税专版的基础上,经过完善和提高。同时加入了税务核算功能、所得税汇算功能。 财税通财务软件的财税同步处理,可将事后税务处理的汇总涉税数据工作化整为零,分解到日常凭证填制…

每日干货丨C语言知识总结----循环结构

介绍循环结构可以看成是一个条件判断语句和一个向回 转向语句 的组合。另外,循环结构的三个要素:循环变量、 循环体 和循环终止条件. ,循环结构在 程序框图 中是利用判断框来表示,判断框内写上条件,两个出口分别对应着…

apache hadoop_使用Apache Hadoop计算PageRanks

apache hadoop目前,我正在接受Coursera的培训“ 挖掘海量数据集 ”。 我对MapReduce和Apache Hadoop感兴趣已有一段时间了,通过本课程,我希望对何时以及如何MapReduce可以帮助解决一些现实世界中的业务问题有更多的了解(我在这里介…

730阵列卡支持多大硬盘_凯捷月销破2万,配6座头等舱空间,到底有多舒服?试驾了才知道...

能够在还未上市的前一个月,就以预售的方式卖出超过2万台,上汽通用五菱在乘用车市场之中的号召力可见一斑。过去我们都将五菱视为商务领域的铭牌,包括宏光、荣光、之光等等家族,都在各自细分市场占据着最顶端位置。如今&#xff0c…

C语言循环嵌套

在C语言中,if-else、while、do-while、for 都可以相互嵌套。所谓嵌套(Nest),就是一条语句里面还有另一条语句,例如 for 里面还有 for,while 里面还有 while,或者 for 里面有 while,w…

rem 前端字体_web前端入门到实战:一次搞懂CSS字体单位:px、em、rem和%

对于绘图和印刷而言,“单位”相当重要,然而在网页排版里,单位也是同样具有重要性,在CSS3普及以来,更支持了一些方便好用的单位(px、em、rem…等),这篇文章将整理这些常用的CSS单位&a…

jvmti_JVMTI标记如何影响GC暂停

jvmti这篇文章分析了为什么Plumbr Agents在某些情况下以及如何延长GC暂停的时间。 对基本问题进行故障诊断揭示了有关在GC暂停期间如何处理JVMTI标记的有趣见解。 发现问题 我们的一位客户抱怨说,附加了Plumbr代理后,应用程序的响应速度明显降低。 通过…

C语言-使用goto语句从循环中跳出

实例代码// //实现功能:使用goto语句从循环中跳出 //#include "stdio.h"#define EXIT 0void show_Menu(){printf("菜单选项:\t");printf("1:显示\t");printf("2:添加\t");printf("3&#xff1a…

装饰器模式java_Java 8的装饰器模式

装饰器模式java在最近的一篇文章中,我描述了装饰器模式如何挽救了我的一天。 我给出了一个小代码段,其中包含创建装饰器的最简单方法,但承诺Java 8会有更好的方法。 这里是: 用Java 8装饰 HyperlinkListener listener this::ch…

C语言-反转字符串

实例代码// //实现功能&#xff1a;输入一个字符串&#xff0c;然后将该字符串反向输出 //#include "stdio.h" #include "string.h"#define N 50void convert_str(char str[N]);void convert_str(char str[N]){int j;char temp;for (int i 0; i < strl…

信捷步进指令的使用_步进电机驱动器的模式

步进电动机和步进电动机驱动器构成步进电机驱动系统。步进电动机驱动系统的性能&#xff0c;不但取决于步进电动机自身的性能&#xff0c;也取决于步进电动机驱动器的优劣。对步进电动机驱动器的研究几乎是与步进电动机的研究同步进行的。步进电机驱动器有三种基本的步进电机驱…

C语言灵魂篇|指针作为函数返回值

C语言允许函数的返回值是一个指针&#xff08;地址&#xff09;&#xff0c;我们将这样的函数称为指针函数。下面的例子定义了一个函数 strlong()&#xff0c;用来返回两个字符串中较长的一个&#xff1a;#include #includechar *strlong(char *str1, char *str2){ if(strlen(s…

css 样式尾部带感叹号是什么意思_CSS书写规范

推荐大家看看百度FEX前端团队和腾讯AlloyTeam前端团队的CSS代码规范。fex-team/styleguide​github.comCode Guide by AlloyTeam​alloyteam.github.io1. 样式属性顺序单个样式规则下的属性在书写时&#xff0c;应按功能进行分组&#xff0c;组之间需要有一个空行。同时要以Pos…

C语言精髓篇|函数的参数和返回值

如果把函数比喻成一台机器&#xff0c;那么参数就是原材料&#xff0c;返回值就是最终产品&#xff1b;从一定程度上讲&#xff0c;函数的作用就是根据不同的参数产生不同的返回值。函数的参数在函数定义中出现的参数可以看做是一个占位符&#xff0c;它没有数据&#xff0c;只…

oc引导win方法_[OC更新]机械革命X1/X6TIS标压测试版更新

加关注这种话银家怎么好意思说出口嘛更新机型机械革命X1 i5-7300hq机械革命X1 i7-7700hq机械革命X6tis i5-7300hq机械革命X6tis i7-7700hq更新内容基于OC0.6.2 MOD版本编译修复WIN下电脑被识别为MBP导致电竞中心打不开问题修复INTEL网卡在BIG SUR下不识别问题禁用secureboot mo…

java 打开gc日志_在运行时打开GC日志记录

java 打开gc日志总是有下一个JVM表现不佳。 而且&#xff0c;您内心深知&#xff0c;如果您只有少数启动选项可以公开一些有关正在发生的事情的信息&#xff0c;那么您可能就有机会真正修复该死的东西。 但是不&#xff0c;您需要的标志&#xff08; -XX&#xff1a; HeapDumpO…

C 和C语言条件运算符的区别

条件运算符&#xff08;conditional operator&#xff09;有时候也称为三元运算符&#xff08;ternary operator&#xff0c;或者trinary operator&#xff09;&#xff0c;因为它是唯一需要 3 个操作数的运算符&#xff1a;条件 ? 表达式1 : 表达式2条件运算操作会首先计算条…