【问题标题】:Sending and receiving a struct in Contiki - Dealing with pointers and structs在 Contiki 中发送和接收结构 - 处理指针和结构
【发布时间】:2019-02-22 14:15:19
【问题描述】:

我目前正在制作一个简单的程序,它试图使用 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 接收到传输时调用该函数。

据我所知,我正在发送&amp;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:错误:分配给类型时类型不兼容 来自“int *”类型的“int[5]”

方法 3:
对于这种方法,我将传入数据转换为 metdata 指针,然后检索 this 指向的给定结构并将其分配给 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]’

说实话,我真的不知道这里发生了什么。我认为这就像获取指向内存地址的指针、获取结构并访问它一样简单,但这并没有发生。我以为我做到了,但似乎我没有完全理解指针。

任何帮助将不胜感激。

【问题讨论】:

  • 指针不是数组,数组也不是指针。数组可以衰减指向指向其第一个元素的指针(即someArray 衰减为&amp;someArray[0])。你不能分配给一个数组,但你可以copy 给它。

标签: c pointers contiki


【解决方案1】:

你的第二种方法是正确的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多