[英]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_H
和ADDR_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_address
、 set_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.