我正在制作一个简单的程序,试图使用contiki在网络上发送结构。我有一个函数,在接收传输时调用,以及一个调用传输的函数。
结构定义如下:
struct metadata {
int values[5];
};
struct metadata packet;
int max_val = 100;
int min_val = 1;
int random_val = random_rand();
if(random_val < 0)
{
random_val *= -1;
}
int proposal_value = (random_val % max_val) + min_val;
int index = node_id - 1;
packet.values[index] = proposal_value;
传输功能:
static void trickle_tx(void *ptr, uint8_t suppress)
{
uip_ipaddr_copy(&trickle_conn->ripaddr, &ipaddr);
uip_udp_packet_send(trickle_conn, &packet, sizeof(packet));
/* Restore to 'accept incoming from any IP' */
uip_create_unspecified(&trickle_conn->ripaddr);
leds_off(LEDS_RED);
}
以下代码用于tcpip_handler
函数,该函数在mote接收传输时调用。
据我所知,我发送的&packet
是我的数据包结构的内存地址。收到后,我想要这个结构中的数据,所以首先需要访问内存位置。所以我创建了一个received_struct
类型的变量struct metadata
,如下所示:
第一种方法:
if(uip_newdata()) {
struct metadata received_struct;
received_struct = (struct metadata) *uip_appdata;
int data[5];
data = received_struct.values;
}
错误:
proposer.c:120:31: error: invalid use of void expression
proposer.c:123:10: error: incompatible types when assigning to type ‘int[5]’ from type ‘int *
第二种方法:
所以从这里我尝试了另一种方法,我将收到的数据包转换为元数据指针。然后我指定received_struct
作为指向received_struct
的指针。在这一点上,我认为received_struct
现在处于'正常'格式,而不是指针既不是地址。然而,这也无法奏效。
if(uip_newdata()) {
struct metadata* received_struct_ptr;
received_struct_ptr = (struct metadata*) uip_appdata;
struct metadata received_struct;
received_struct = *received_struct_ptr;
int data[5];
data = received_struct.values;
}
错误:
proposer.c:125:10:错误:从类型'int *'分配类型'int [5]'时出现不兼容的类型
方法3:
对于这种方法,我将传入的数据转换为metdata
指针,然后检索由此指向的给定结构并将其分配给data_struct
并尝试访问数据。
if(uip_newdata()) {
struct metadata* struct_pointer;
struct_pointer = (struct metadata*) uip_appdata;
struct metadata data_struct;
data_struct = *struct_pointer;
int data [5];
data = &data_struct.values;
错误:
proposer.c:125:10: error: incompatible types when assigning to type ‘int[5]’ from type ‘int (*)[5]’
说实话,我真的不知道这里发生了什么。我认为这就像把指针指向内存地址,获取结构并访问它一样简单,但这不会发生。我以为我做了,但似乎我完全不理解指针。
任何帮助,将不胜感激。
第二种方法是你走在正确的轨道上。
received_struct_ptr = (struct metadata*) uip_appdata;
struct metadata received_struct;
received_struct = *received_struct_ptr;
int data[5];
您已将指针强制转换为正确的类型,并将接收的数据分配给结构。但是C语言中没有内置功能可以将数组的每个成员分配给另一个数组,因此您需要手动完成:
int i;
for(i=0; i<5; ++i)
{
data[i] = received_struct.values[i];
}
但请注意,data
实际上并不比received_struct.values
更易于访问或有用,并且您已在代码中引入了另一个数字5
。如果阵列的大小将来发生变化,那可能会出现问题。因此,考虑到所有事情,您可能最好直接访问该数据(int final_value = received_struct.values[4];
)而不是复制。