gpt4 book ai didi

c - 在 Contiki 中发送和接收结构 - 处理指针和结构

转载 作者:太空宇宙 更新时间:2023-11-04 03:12:44 25 4
gpt4 key购买 nike

我现在正在制作一个简单的程序,它试图使用 contiki 通过网络发送一个结构。我有一个在接收传输时调用的函数,以及一个在传输时调用的函数。

struct 定义如下:

 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 函数,该函数在微尘接收到传输时调用。

据我所知,我正在发送 &packet,这是我的数据包结构的内存地址。收到后,我想要这个结构中的数据,所以首先需要访问内存位置。所以我创建了一个struct metadata类型的变量received_struct:
第一种方法:

   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: error: incompatible types when assigning to type ‘int[5]’ from type ‘int *’

方法 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];) 而不是制作副本。

关于c - 在 Contiki 中发送和接收结构 - 处理指针和结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54829017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com