当前位置: 首页 > news >正文

GPT对话代码库——结构体与全局变量的比较,使用结构体的好处

目录

1,问:

1,答:

1. 组织性和可读性

2. 数据封装

3. 避免命名冲突

4. 模块化

5. 易于扩展

6. 函数参数传递

总结

2,问:

2,答:

示例分析

使用结构体的好处

组织性和模块化

避免命名冲突

易于扩展和维护

函数参数传递

总结:


提问模型:GPT-4o-mini Free

提问时间:2024.07.30

1,问:

#ifndef _ADC_DMA_H
#define _ADC_DMA_H
#include "stm32f10x.h"

#define PW_ADC_SAMPLE_LEN            8        //ADC样本空间长度

#define PW_VI_RATIO                    ((16.6667f*3.3f)/4096)
#define PW_VO_RATIO                    ((16.6667f*3.3f)/4096)
#define PW_VA_RATIO                    ((16.6667f*3.3f)/4096)
#define PW_IO_RATIO                    ((4.5833f*3.3f)/4096)

typedef struct  
{
    uint16_t ADC_ConvertedValue[4]; //用来保存ADC各通道转换完成后的数据
    
    uint16_t outV[PW_ADC_SAMPLE_LEN];
    uint16_t outI[PW_ADC_SAMPLE_LEN];
    uint16_t inV[PW_ADC_SAMPLE_LEN];
    uint16_t outVA[PW_ADC_SAMPLE_LEN];

    float Vo;
    float Io;
    float Vi;
    float VA;

}_uADC_Type;

extern _uADC_Type    power;


void ADC_DmaConfig(void);
void ADC_GetNewSample(void);

#endif
为什么在这种程序中总是使用结构体,而不使用全局变量,是有什么好处吗

1,答:

在嵌入式编程中,尤其是像你所示的这种使用 STM32 微控制器的程序中,使用结构体而不是全局变量有几个明显的好处:

1. 组织性和可读性

结构体允许你将相关的数据组织在一起,使代码更具可读性和可维护性。例如,在你的代码中,_uADC_Type 结构体将所有与 ADC 相关的数据(如转换值、样本数据、浮点结果等)封装在一个地方。这比使用多个全局变量更易于理解和管理。

2. 数据封装

结构体可以将数据和相关的操作(如函数)封装在一起,这符合面向对象编程中的封装原则。在你的例子中,所有与 ADC 相关的变量都在 _uADC_Type 结构体中定义,这样可以确保这些变量作为一个整体处理,从而减少对全局命名空间的污染。

3. 避免命名冲突

全局变量容易导致命名冲突,特别是在大型项目中,多个文件和模块可能会使用相同的变量名。结构体通过将数据分组在一个名字空间中,减少了这种冲突的可能性。

4. 模块化

使用结构体使得代码模块化。例如,你可以在不同的文件中定义不同的结构体和操作函数,这使得不同的模块可以独立开发和测试,然后将它们组合在一起。这种方法使得代码更加模块化和结构化。

5. 易于扩展

当你需要增加或修改与 ADC 相关的数据时,只需要在结构体中进行相应的更改,而不必去修改所有使用这些全局变量的地方。这样结构体的使用使得数据的扩展和维护变得更加简便。

6. 函数参数传递

在函数中使用结构体作为参数,可以传递一组相关的数据,而不是单独传递多个参数。这可以使函数调用更加简洁和清晰。例如,你可以将 _uADC_Type 结构体作为参数传递给处理 ADC 数据的函数,从而避免了多个参数的传递。

总结

总之,使用结构体而不是全局变量可以提升代码的组织性、可读性、封装性和模块化,使代码更易于维护和扩展。这是嵌入式编程中一种常见的良好实践。

2,问:

#ifndef _ADC_DMA_H
#define _ADC_DMA_H
#include "stm32f10x.h"

#define PW_ADC_SAMPLE_LEN            8        //ADC样本空间长度

#define PW_VI_RATIO                    ((16.6667f*3.3f)/4096)
#define PW_VO_RATIO                    ((16.6667f*3.3f)/4096)
#define PW_VA_RATIO                    ((16.6667f*3.3f)/4096)
#define PW_IO_RATIO                    ((4.5833f*3.3f)/4096)

typedef struct  
{
    uint16_t ADC_ConvertedValue[4]; //用来保存ADC各通道转换完成后的数据
    
    uint16_t outV[PW_ADC_SAMPLE_LEN];
    uint16_t outI[PW_ADC_SAMPLE_LEN];
    uint16_t inV[PW_ADC_SAMPLE_LEN];
    uint16_t outVA[PW_ADC_SAMPLE_LEN];

    float Vo;
    float Io;
    float Vi;
    float VA;

}_uADC_Type;

extern _uADC_Type    power;


void ADC_DmaConfig(void);
void ADC_GetNewSample(void);

#endif
举例详细说明,为什么在这种程序中总是使用结构体,而不使用全局变量,是有什么好处吗

2,答:

在嵌入式编程中,尤其是在 STM32 微控制器这样的系统中,使用结构体来组织数据而不是使用全局变量具有很多优势。以下是一些详细的好处,以及如何通过示例来理解这些好处。

示例分析

假设我们有一个电源监控系统,需要从 ADC 中读取多个传感器的值,并进行处理。你定义了一个结构体 _uADC_Type 来封装与 ADC 数据相关的信息,如下:

typedef struct  
{uint16_t ADC_ConvertedValue[4]; // 用来保存ADC各通道转换完成后的数据uint16_t outV[PW_ADC_SAMPLE_LEN];uint16_t outI[PW_ADC_SAMPLE_LEN];uint16_t inV[PW_ADC_SAMPLE_LEN];uint16_t outVA[PW_ADC_SAMPLE_LEN];float Vo;float Io;float Vi;float VA;
} _uADC_Type;extern _uADC_Type power;

使用结构体的好处

  1. 组织性和模块化

    结构体示例

    _uADC_Type power;

    全局变量示例

    uint16_t ADC_ConvertedValue[4];
    uint16_t outV[PW_ADC_SAMPLE_LEN];
    uint16_t outI[PW_ADC_SAMPLE_LEN];
    uint16_t inV[PW_ADC_SAMPLE_LEN];
    uint16_t outVA[PW_ADC_SAMPLE_LEN];
    float Vo;
    float Io;
    float Vi;
    float VA;
    

    好处

    • 结构体:将所有相关的 ADC 数据封装在一个结构体中,使得代码更加整洁和模块化。power 结构体内包含了所有与 ADC 相关的变量,这使得代码逻辑更加明确。
    • 全局变量:所有全局变量都在一个名字空间中,可能导致混乱和管理困难。变量之间缺乏组织,代码可读性差。
  2. 避免命名冲突

    结构体示例

    power.ADC_ConvertedValue[0] = 1234;
    
     

    全局变量示例

    ADC_ConvertedValue[0] = 1234;
    
     

    好处

    • 结构体:结构体字段有明确的前缀(如 power.),避免了不同模块中变量名的冲突。
    • 全局变量:所有变量都在同一全局空间中,容易发生命名冲突,尤其是在大型项目中。
  3. 易于扩展和维护

    结构体示例

    typedef struct  
    {uint16_t ADC_ConvertedValue[4];uint16_t outV[PW_ADC_SAMPLE_LEN];uint16_t outI[PW_ADC_SAMPLE_LEN];uint16_t inV[PW_ADC_SAMPLE_LEN];uint16_t outVA[PW_ADC_SAMPLE_LEN];float Vo;float Io;float Vi;float VA;
    } _uADC_Type;
    
     

    好处

    • 结构体:如果需要添加新的 ADC 相关数据或修改现有数据,直接在结构体中添加或修改字段即可,无需修改大量代码。
    • 全局变量:添加新变量或修改现有变量时,可能需要修改多个函数中的代码,维护工作更加繁琐。
  4. 函数参数传递

    结构体示例

    void processADCData(_uADC_Type *adcData);
    
     

    好处

    • 结构体:通过传递结构体指针,可以一次性传递多个相关的数据。函数接口简洁,代码清晰。
    • 全局变量:如果用全局变量,函数不需要参数,但这会导致函数之间强耦合,使得单元测试和函数重用变得困难。

总结:

使用结构体而不是全局变量有助于组织代码、减少命名冲突、提高扩展性和维护性,并且使函数接口更清晰。在复杂的嵌入式系统中,这些优势使得结构体成为管理和处理数据的推荐方法。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++高阶】哈希:全面剖析与深度学习
  • 基于N32L406的EasyLogger日志库移植教程
  • vue如何在axios.js中跳转页面(解决办法)
  • LeetCode541 反转字符串 II
  • Java----反射
  • 英伟达推出新中国特供版芯片B20:挑战与机遇并存
  • OD C卷 - 王者荣耀游戏分组
  • 顺序表,链表,顺序栈,顺序循环队列,链式队列的基本操作
  • 为什么说脱离决策的数据分析都是无用功
  • 【AI落地应用实战】DAMODEL深度学习平台部署+本地调用ChatGLM-6B解决方案
  • Android Java和Kotlin的目标JVM版本不一致
  • 数据炼金术:在sklearn中进行增量特征合成的秘诀
  • 弱网常见问题
  • 25考研计算机组成原理复习·3.1/3.2 存储器概述/主存储器
  • Hugo 部署与自动更新(Git)
  • C++入门教程(10):for 语句
  • Mithril.js 入门介绍
  • ng6--错误信息小结(持续更新)
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 初识MongoDB分片
  • 关于springcloud Gateway中的限流
  • 入门级的git使用指北
  • 【云吞铺子】性能抖动剖析(二)
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 进程与线程(三)——进程/线程间通信
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​linux启动进程的方式
  • ​用户画像从0到100的构建思路
  • #### golang中【堆】的使用及底层 ####
  • #git 撤消对文件的更改
  • (152)时序收敛--->(02)时序收敛二
  • (bean配置类的注解开发)学习Spring的第十三天
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Java数据结构)ArrayList
  • (libusb) usb口自动刷新
  • (不用互三)AI绘画工具应该如何选择
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)Linq学习笔记
  • .bat文件调用java类的main方法
  • .JPG图片,各种压缩率下的文件尺寸
  • .Net 6.0--通用帮助类--FileHelper
  • .NET CORE Aws S3 使用
  • .NET delegate 委托 、 Event 事件
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .net 无限分类
  • .net6+aspose.words导出word并转pdf
  • .NET连接MongoDB数据库实例教程
  • .NET命名规范和开发约定