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);
    
     

    好处

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

总结:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄奕子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值