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

时间:2019-02-22 14:15:20

标签: c pointers contiki

我现在正在编写一个简单的程序,试图使用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函数,该函数在节点接收到传输时被调用。

据我所知,我正在发送&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]’

说实话,我真的不知道这是怎么回事。我认为这就像将指针指向内存地址,获取结构并访问它那样简单,但这没有发生。我以为我做到了,但是似乎我对指针的理解还不够。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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];)数据而不是进行复制。