我正在尝试创建一些类似数组的结构来处理MODBUS数据和地址。
我正在结构中进行操作,因此稍后设置某些值而不是参考数据表来查找将哪个地址耦合到数据更为简单。
有些地址留为空白,并保留以供将来使用(我知道MODBUS标准中未指定此地址,数据不必完全是MODBUS特定的)。
我创建了一个结构,该结构可在应运行的嵌入式设备的软件上进行编译。但是我不确定它是否会像我想象的那样运行,所以我在2种不同的编译器上运行了一些测试代码。 1是一个在线C编译器,其运行方式与我所预期的相同,仅在保留字节处发出一个警告。 第二个程序在Visual Studio c ++控制台应用程序中运行,该程序无法运行,因为它会产生错误:
错误C2208'unsigned short':没有使用此类型定义的成员
这是应运行的完整代码:
#include <stdio.h>
#include <stdint.h>
#define U16 uint16_t
#define UI unsigned int
struct t {
U16 t1;
union {
struct {
UI b_f1 : 2;
UI b_f2 : 2;
UI b_f3 : 2;
UI b_f4 : 2;
UI b_f5 : 2;
UI b_f6 : 2;
UI b_f7 : 2;
UI b_f8 : 2;
}f;
U16 c;
}t2;
U16; //Reserved space for later use <- this gives me the compiler error
U16 t3;
}test;
int main()
{
test.t3 = 12;
test.t2.f.b_f1 = 0; //0
test.t2.f.b_f2 = 2; //4 (8)
test.t2.f.b_f3 = 0; //16
test.t2.f.b_f4 = 0; //64
test.t2.f.b_f5 = 0; //256
test.t2.f.b_f6 = 0; //1024
test.t2.f.b_f7 = 2; //4096 (8192)
test.t2.f.b_f8 = 0; //16384
//tot: 8200
test.t1 = 3000;
int h; //test variable
for (int i = 0; i < (sizeof(test) / sizeof(U16)); i++) {
h = *(&test.t1 + (i*sizeof(U16));
printf("%d", h); //here I can now send every MODBUS address & data
}
return 0;
}
不需要设置变量,仅用于测试目的
我预计它将只生成4个元素的结构,一个是0指针,这样寻址是正确的,因为不使用地址3,因此地址4(t3)为0时将包含更多数据。
是否有办法使我计划完成的工作,还是应该在两者之间创建一些名为Reserved1..Reserverd2..etc的变量?
答案 0 :(得分:3)
类似于
的“声明”U16; //Reserved space for later use
完全无效。
只需使用一些虚拟名称即可解决您的问题,例如
U16 _reserved_; //Reserved space for later use
答案 1 :(得分:2)
不,你不能。类型本身不是结构定义中的有效声明。
您可以做的是使用__LINE__
帮助确保您分配给变量的名称是唯一的:
#define _concat(a,b) a##b
#define concat(a,b) _concat(a,b)
然后写
U16 concat(t, __LINE__);
在struct
名称t
是唯一的范围内是唯一的。
答案 2 :(得分:1)
有没有办法使我计划做的这项工作?
否。
或者我应该在之间创建一些名为Reserved1..Reserverd2..etc
的变量
是的