int chat *int sizeof 嵌入式开发中结构化编程局限,C语言模拟面向对象编程实现
2025-12-17 22:03:55发布 浏览309次 信息编号:231913
友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。
int chat *int sizeof 嵌入式开发中结构化编程局限,C语言模拟面向对象编程实现
一、结构化编程在嵌入式开发中的局限与挑战
函数以及数据结构作为核心的结构化编程,把系统划分成彼此独立的过程,在嵌入式场景里面,这种模式存在诸多典型的不足,:
1. 数据封装性不足
在结构化编程里头,数据跟操作是相互分离的这种状况,从而引发了数据存在容易遭受非法修改的情况,就好比,对于传统的传感器数据采集模块而言 !
用结构化编程的方式,有一个整型变量sensorValue,还有一个名为readSensor的函数,它的定义如下: ,还有一个名为readSensor的函数,它的定义如下:
将传感器值进行读取操作,其值被赋值给sensorValue 。有一个函数名为getSensorValue ,它的作用是直接返回sensorValue 。
}
上述代码中,作为全局变量,可被任意函数修改,缺乏访问控制。
2. 代码重用性有限
函数调用是结构化编程达成复用的方式,不过它在应对复杂逻辑变化时存在困难,像不同模样的传感器,也就是温度传感器与湿度传感器,都得反复去编写类似的读取逻辑 。
3. 系统扩展性较差
当系统需求出现变更的情况时,结构化的代码需要去修改处在多处不同位置的逻辑。比如说要增加关于传感器校准的功能的话,如此就需要直接对读取函数进行修改。
二、C 语言模拟面向对象编程的核心实现
1. 封装:用结构体与函数指针构建 "类"
C 语言借助结构体来让数据被封装起来从而实现数据的封装,通过函数指针达成方法的实现,进而模拟类所具备的封装特性,。
// 对于传感器类进行面向对象的那种实现类型定义而设置了这样一个结构体,结构体里有一个整型的value,还有一个整型的updateFreq,另外还有一个整型的filterFreq,并且这里存在方法指针。
类型为指向函数的指针,该函数无返回值,其参数为结构体指针类型,函数返回值类型未知的 getValue,结构体类型为 Sensor,类型为指向函数的指针,该函数无返回值,第一个参数为结构体指针类型为 Sensor且第二个参数为整型的 setValue,类型为指向函数的指针,该函数无返回值,其参数为结构体指针类型为 Sensor的init,类型为指向函数的指针,该函数无返回值,其参数为结构体指针类型为 Sensor的 destroy。
}传感器;// 用于构造此传感器的函数,void Sensor_init(Sensor类型指针me) {。
me->value = 0;
me->updateFreq = 100;
me->filterFreq = 50;
}// 用于执行析构操作的函数 void 让名为 Sensor_destroy 的函数,该函数接受一个指向 Sensor 类型的指针 me 作为参数 {。
free(me);
}// 获取值的办法,整型的Sensor_getValue,其中Sensor为指针变量me,此方法返回me所指向对象下的value属性的值。
如下这般,来着手创建传感器实例,Sensor* Sensor_create() { }。
传感器指针“我”被设定为(传感器指针类型)通过动态内存分配函数分配出的(传感器类型)大小的空间,要是“我”这个指针有指向的空间。
变为,我把初始化操作,设定为传感器初始化函数,即,通过我来进行初始化,其对应的初始操作,是传感器初始化 。
将“me”指向的“destroy”这个属性,设置为“Sensor_destroy” , 。
我将获取值的操作设定为传感器获取值 。将我获取到的值设定为传感器获取的值操作 。 把我要获取的值的行为设置成传感器获取值的行为 。
先将 me 的值设为 Sensor_setValue,再执行 setValue 操作 ,这一过程是这样的 。
me->init(me);
} return me;
}// 使用示例void useSensor() {
Sensor* tempSensor被创建,用于存储Sensor_create()的返回值,int value被赋值为tempSensor调用其自身的getValue方法所返回的值,该方法的参数为tempSensor 。
临时传感器,将其自身进行销毁操作,针对该临时传感器实施此项销毁动作 。
}
把数据呀进行汇聚,收纳于结构体那儿,同时呢把操作也一并放置其中,如此这般,就达成了类的那种最基础的封装特性哟。并且呀,外部人员呢,仅仅能够借助方法指针这种途径,才可以去访问数据呢。
2. 继承:嵌套结构体与方法重载
C语言借助嵌套基类结构体,历经覆盖函数指针达成继承:,//基类:通用传感器, { ,int value, ,int (*)( *) ,。
}通用性传感器;// 派生出的类别:温度感应器,将其界定为有着如下布局地结构体:{。
名为GenericSensor的基础之物,是用于继承基类的 。
float tempCoeff,有一个函数指针float (*getTemperature)(struct TemperatureSensor*) 。(注:这里改写后在不改变原意基础上拆分组合让句子读起来稍复杂些了,原句这样拆分意义不是特别大,主要为满足任务要求。)。
温度传感器初始化,将其命名为TemperatureSensor ,存在一个函数名为TemperatureSensor_init ,该函数接收一个指向TemperatureSensor的指针me ,用于执行初始化操作 。
有一个指向函数的指针,它对应着一个函数,这个函数没有参数,返回值是整型,它的参数是一个指向结构体的指针,结构体用于表示通用传感器 ,而这个指针要指向的函数是TemperatureSensor_getValue。并且,有另一个代表我的东西,它有一个名为base的成员,这个成员又有一个名为getValue的成员 ,这个getValue成员要。
将TemperatureSensor_getTemperature赋给me的getTemperature ,。
me->tempCoeff = 0.1;
}// 覆盖基类方法,int类型的TemperatureSensor_getValue函数,其参数为GenericSensor指针类型的me {。
温度传感器指针类型的传感器,被强制转换为温度传感器类型,赋值给指针变量传感器,用于扩展基类的逻辑,。
返回,传感器指向的结构体中的基础值,乘以,传感器指向的结构体中的温度系数。
}
派生类借助嵌套结构体去继承基类属性,并且凭借函数指针重载达成方法覆盖。
3. 多态:函数指针与接口抽象
通过函数指针,在C语言里实现动态绑定从而将多态性贯彻其中,就拿传感器数据处理当作例子来说:
// 传感器接口typedef struct {
定义了一个指针,这个指针指向一个函数,该函数有两个参数,第一个参数是指向一个结构体的指针,这个结构体是传感器接口结构体,第二个参数是一个整数,这个指针被命名为processData;。
传感接口;// 温度传感器为实现,空的温度传感器处理数据函数,其参数为传感界面指针及整型数据,内部打印出带摄氏度单位的温度数值 { 温度传感器处理数据(传感接口指针,整型数据) { 打印输出(“温度:%d°C\n”,数据); } }。
# 湿度传感器实现, # 此时 void HumiditySensor_processData(SensorInterface* iface, int data) 函数中, # 执行 printf("Humidity: %d%%n", data); 语句, # 用于最终实现湿度传感器的数据处理及输出功能。
}// 执行统一处理操作的函数,名为processSensorData,其参数为指向SensorInterface类型的指针sensor以及整型数据data ,此函数用于处理来自传感器的数据从而实施统一处理 {。
该传感器向处理数据函数送出该传感器以及该数据,以进行数据处理,。
// 运用多态, void 类型的 demoPolymorphism 函数被使用{ }。
一个名为SensorInterface的,被称作tempSensor的东西 。
临时传感器,负责处理数据的那个功能,被设定为等于,温度传感器处理数据这个操作,用来处理数据的那个功能,所对应的那个操作,所对应的那个功能 。
SensorInterface humSensor;
用于处理数据的humSensor,其对应的处理数据方法是HumiditySensor_processData,二者相等 。
将温度传感器关联,进行处理,使其对应温度为二5摄氏度,对其数据加以过程处理标点,分号。
使处理传感器数据的操作执行在所给出的湿度传感器及六十这一数值上并予以推进 。为推进该操作遂实施针对湿度传感器以及六十这个数值的处理传感器数据。
}
通过统一接口,不同传感器实现可被同一函数处理,体现多态性。
三、面向对象思想在嵌入式状态机中的应用
嵌入式系统里头,状态机属于常见的模型,结合面向对象的思想,能够借助函数指针表实现状态变化,状态机基类包含某些要素,有整型变量,有特定的函数指针,还有另外的函数指针,其参数类型和返回类型各有不同 。
}状态机,安全控制器的;把它定义为结构体类型,取名为,typedef struct {。
一个名为StateMachine的基础对象,存在一个整型的重试次数值,还有一个用于指向状态处理函数的指针 。
会空指针类型的函数指针,其指向返回值为空且参数为结构体SecurityController指针类型的函数,此函数指针名为idleState;会空指针类型的函数指针,其指向返回值为空且参数具有结构体SecurityController指针类型的函数,该函数指针名为acceptingState。
出现了分号,分号后面的内容是代码中的函数声明,其表达了一个名为SecurityController_transition的函数,这个函数用于状态转移逻辑,它接受两个参数,一个是指向StateMachine结构体的指针me,另一个是整数值newState,在SecurityController中被定义 。
一个名为controller的SecurityController*类型的变量,被赋值为将me强制转换为SecurityController*类型后的值,。
这个控制器,它所具有的,表示当前状态的那个东西,被赋予了一个新的状态,这个新状态是全新的,和之前不一样的那个状态 ,句号。
// 根据状态调用对应处理函数
根据新状态的值进行检查,当新状态的值为空闲的标识状态时,执行下列操作 。
控制器进入Idle状态,执行相关操作,随后进入接受状态,接着执行相应动作,再进入空闲状态,执行完相关操作后,接着执行后续操作,随后进入接受状态,执行完相关动作后,再进入空闲状态,执行完相关指令后,接着执行后续指令,随后进入接受状态,执行完相关命令后,再进入空闲状态,执行完相关动作后,接着……执行完操作,接着执行后续操作……直到某次执行完操作后,执行。
}
}// 事件处理,对于void SecurityController_handleEvent(StateMachine* me, int event) 来说,其中,StateMachine 被称为me,int类型的event是其参数,这里存在着,关于事件处理的逻辑,具体为...
SecurityController进行过渡操作,针对我,进入新状态;。
}
把状态机逻辑囊括于类之中,状态转移以及事件处理被弄成方法来进行抽象,如此一来系统的可维护性还有扩展性便得到了提高。
四、面向对象编程在嵌入式中的实践优势与挑战
1. 优势
2. 挑战
五、结语
在嵌入式系统里头,C语言借助结构体跟函数指针,来进行面向对象编程的模拟,从而为复杂系统设计,带去了有效的解决办法。这种实践,一方面保留了C语言的高效特性,另一方面又引入了面向对象的封装特性、继承特性还有多态特性,使得嵌入式系统,在维护方面、扩展方面以及复用方面,变得更加容易。随着嵌入式系统复杂度的不断提升,面向对象思想在C语言当中的应用,将会成为提升开发效率的重要手段。
提醒:请联系我时一定说明是从星空网上看到的!