繁体   English   中英

我可以从 PIC C18 中的 main.c 访问我的 source.c 中的联合吗?

[英]Can I access a union in my source.c from main.c in PIC C18?

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

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

我如何在 main.c 中读取例如ADDR_HADDR_M的值,同时从 source.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);
}

基本程序设计:

  • 永远不要在头文件中声明变量。
  • 切勿将意大利面条式编程与extern
  • 不要在处理协议的翻译单元之外直接暴露内部结构,例如这个协议结构。 您需要在两者之间有一个抽象层。

快速和肮脏的解决方案:

  • 将 h 文件中的联合定义更改为 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_addressset_data等函数,调用者无需了解协议内部即可知道这些函数。

最简单的方法是 typedef 联合

在 header.h

typedef union
{
    struct
    {
        ...
    };
    unsigned char STRUCT_ARRAY[6];
}MyUnionType;

extern MyUnionType MY_UNION;

然后在 source.c 中定义变量

MyUnionType MY_UNION;

此变量现在可用于任何源文件。 (main.c 等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM