如何将数据从一个结构链接到另一个结构
How to link data from one struct to the other
我正在对ArtNet存储库进行一些更改。我想扩展它一点,但为了有效地做到这一点,我有几个我不知道答案的问题。 请考虑下面的代码段。 如您所见,我有三个结构:
- ArtNetNode:包含所有节点标识信息。IP和短/长名称可能会在程序期间更改。
- ArtPollReplyPack:此结构附加了 pack 参数。我稍后会使用此结构,因此请发送 udp 数据包。它实际上是artnet协议规范中规定的整个软件包。
- ArtDmxPack:类似于第二点,但可以证明来自节点结构的数据在多个数据包中使用的观点。
当前的暗示使许多副本无法获得特定信息,我指的是IP地址,mac,短名称和长名称。如果这些参数之一发生更改,我需要在所有三个位置上更改它。这不是很有效率。 我的问题是我怎样才能提高效率,所以我只需要更改node.ip而不是所有三个位置。搜索将我引导到指针,这真的很有意义。但是,我会弄乱结构打包,因为ArtPollReplyPack和ArtDmxPack实际上是软件包的完整数据集。谁能帮我克服这个问题?也许以身作则。
谢谢你的时间!
仅供参考:我正在使用带有Wiz8xx以太网端口的Teensy 3.2板上实现Teensyduino。
#include <Ethernet.h>
#include <EthernetUdp.h>
EthernetUDP Udp;
byte mac[] = {0x04, 0xE9, 0xE5, 0x00, 0x69, 0xEC};
IPAddress controllerIP(192, 168, 0, 2);
struct ArtNetNode {
IPAddress ip;
uint8_t mac[6];
uint8_t oemH;
uint8_t oemL;
uint8_t shortname[18];
uint8_t longname[64];
};
struct ArtPollReplyPack {
uint8_t id[8];
uint16_t opCode;
uint8_t ip[4];
uint8_t mac[6];
uint16_t port;
uint8_t oemH;
uint8_t oemL;
uint8_t shortname[18];
uint8_t longname[64];
}__attribute__((packed));
struct ArtDmxPack {
uint8_t id[8];
uint16_t opCode;
uint8_t ip[4];
uint16_t port;
uint8_t DmxData[512];
}__attribute__((packed));
struct ArtNetNode node;
struct ArtPollReplyPack ArtPollReply;
struct ArtDmxPack ArtDmx;
void setup() {
ArtPollReply.oemH = node.oemH;
ArtPollReply.oemL = node.oemL;
memcpy(ArtPollReply.shortname, node.shortname, sizeof(node.shortname));
memcpy(ArtPollReply.longname, node.longname, sizeof(node.longname));
memcpy(node.mac, mac, sizeof(mac));
memcpy(ArtPollReply.mac, node.mac, sizeof(node.mac));
Ethernet.begin(mac);
Udp.begin(6454);
}
void loop() {
switch(Ethernet.maintain()) {
case 1:
case 3:
// rebind / renew failed.
break;
case 2:
case 4:
// update the node IP address.
memcpy(node.ip, Ethernet.localIP(), 4);
case 0:
default:
break;
}
Udp.beginPacket(controllerIP, 6454);
Udp.write((uint8_t *)&ArtPollReply, sizeof(ArtPollReply));
Udp.endPacket();
}
无法一次更改两个或多个结构的数据。但是,您可以将它们与一个特定的结构附加在一起,这样每当该特定结构的数据或我们可以说基础结构发生变化时,它都会影响所有其他结构。总的来说,只需在所有其他结构中调用基础结构。 例如,请参阅下面的代码:
struct o{
int data=3;
char name='c';
}one;
struct t{
int data=one.data;
char name=one.name;
}two;
现在,当您调用结构二时,它将打印结构一中的数据。
如果不将所有三个 IP 地址设置为相同的值,就没有真正的方法将所有三个 IP 地址设置为相同的值。
但是,您不必使用 memcpy(( 函数调用...如果你想变得非常混乱,你可以利用IP地址是4个字节的事实,即一个uint32_t,所以如果你投射到它,你可以直接分配而不是使用memcpy,即
union IP {
uint8_t ip[4];
uint32_t ipAsInt;
};
现在只需复制ipAsInt而不是memcpying。
[老实说,我不能保证编译器无论如何都不会为您优化]
相关文章:
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 静态结构和一个定义规则
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 如何在 C++11 中查找和更新向量中的一个嵌套结构
- 在学习数据结构之前对STL有一个了解是好的吗?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 从另一个 cpp 文件更改结构内、映射键内的变量
- 如何将一个结构的字符数组复制到结构的另一个字符数组中?
- 使用完数据结构后清空数据结构是一个好习惯吗?
- 如何制作一个地图,其中的值是C++中的结构数组
- 如何将数据从一个结构链接到另一个结构
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- error dllimport 函数的定义不允许在一个特定的联合中,而其他类、结构和联合将按预期导出
- std::transform 将一个结构数组复制到另一个结构数组
- C++:如何做一个链表,结构作为参数传递?
- 输入 ctrl + x 后如何再次 cin (cin<<x) 循环(cin 一个结构)
- 两个附带的类层次结构-一个好的设计模式