首页 > 解决方案 > 我可以从 PIC C18 中的 main.c 访问我的 source.c 中的联合吗?

问题描述

我处于一个包含多个元素的匿名结构的位置。为了通过索引访问它们,我将它们放在一个联合中,如下所示:

union
{
    struct
    {
        unsigned char COMMAND;      //STRUCT_ARRAY[0]
        unsigned char ADDR_H;       //STRUCT_ARRAY[1]
        unsigned char ADDR_M;       //STRUCT_ARRAY[2]
        unsigned char ADDR_L;       //STRUCT_ARRAY[3]
        unsigned char DATA;         //STRUCT_ARRAY[4]
        unsigned char CHECKSUM;     //STRUCT_ARRAY[5]
    };
    unsigned char STRUCT_ARRAY[6];
    //all of the struct members can be accessed from STRUCT_ARRAY by index
}MY_UNION;

此联合当前驻留在文件source.c中。我需要从main.c. 我有一个两个文件都包含的标题,我们称之为header.h

ADDR_H例如,如何ADDR_M在从 source.c 定期修改时读取 main.c 中的值?

代码有点像这样:

来源.c:

#include "header.h"

union
{
    struct
    {
        unsigned char COMMAND;      //STRUCT_ARRAY[0]
        unsigned char ADDR_H;       //STRUCT_ARRAY[1]
        unsigned char ADDR_M;       //STRUCT_ARRAY[2]
        unsigned char ADDR_L;       //STRUCT_ARRAY[3]
        unsigned char DATA;         //STRUCT_ARRAY[4]
        unsigned char CHECKSUM;     //STRUCT_ARRAY[5]
    };
    unsigned char STRUCT_ARRAY[6];
    //all of the struct members can be accessed from STRUCT_ARRAY by index
}MY_UNION;

void modify(void)
{
    MY_UNION.ADDR_H = somevalue;
    MY_UNION.ADDR_M = somevalue;
    MY_UNION.ADDR_L = somevalue;
}

在 main.c 中:

#include "header.h"

void main(void)
{
    modify();
    print(MY_UNION.ADDR_H);    //custom function to print values to a screen
    print(MY_UNION.ADDR_M);
    print(MY_UNION.ADDR_L);
}

标签: cunionsextern

解决方案


基本程序设计:

  • 永远不要在头文件中声明变量。
  • 永远不要使用带有extern.
  • 不要在处理协议的翻译单元之外直接公开诸如此协议结构之类的内部结构。您需要在两者之间有一个抽象层。

快速而肮脏的解决方案:

  • 将 h 文件中的 union 定义更改为 typedef:

    typedef union 
    {
        struct
        {
            unsigned char COMMAND;      //STRUCT_ARRAY[0]
            unsigned char ADDR_H;       //STRUCT_ARRAY[1]
            unsigned char ADDR_M;       //STRUCT_ARRAY[2]
            unsigned char ADDR_L;       //STRUCT_ARRAY[3]
            unsigned char DATA;         //STRUCT_ARRAY[4]
            unsigned char CHECKSUM;     //STRUCT_ARRAY[5]
        };
        unsigned char STRUCT_ARRAY[6];
        //all of the struct members can be accessed from STRUCT_ARRAY by index
    } MY_UNION;
    
  • 在 .c 文件中本地声明实际变量:static MY_UNION my_union;.

  • 使用 setter/getter 访问变量,例如:

    uint8_t get_address_h (void)
    {
      return my_union.ADDR_H;
    }
    
    void set_address_h (uint8_t addr_h)
    {
      my_union.ADDR_H = addr_h;
    }
    

适当的解决方案:

在一个合适的程序中,你应该完全隐藏这个协议的内部,对其他文件,包括 typedef 联合。

除了协议转换器之外,没有人可以访问这个联合。您将拥有调用者可以在不知道协议内部结构的情况下知道的函数set_address等。set_data


推荐阅读