如何将struct成员作为函数中的指针传递

时间:2013-07-29 15:32:58

标签: c

首先,我想说在发布这个问题之前,我已经在这个论坛上详尽地搜索了答案,但我没有找到任何答案。

好的,问题是我的结构是另一个(主要)结构的成员。我写了一个函数来清除第一个结构(它需要一个指向struct的指针)。 我想使用该函数清除主结构中的结构,但我不确切知道哪种方法是正确的。

为了更好地解释它,这里有一些代码:

我有一个结构,定义为:

typedef struct
{
    unsigned char next;
    unsigned char first;
    unsigned long data[TCP_RX_BUFFER+1]; 
}struct_circ_buff;

以及清除它的功能:

void clearCircularBuffer(volatile struct_circ_buff *circular_buffer)
{
    int i=0;

    for(i=0;i<TCP_RX_BUFFER+1;i++)
        circular_buffer->data[i]=0;

    circular_buffer->first=0;
    circular_buffer->next=0;
}

然后,我有另一个包含struct_circ_buff的结构:

typedef struct 
{
    volatile unsigned char sensorType;
    volatile uint16_t  sensorFlag;
    volatile struct_circ_buff st_circular_buffer;
}struct_sens;

我想编写一个函数来清理这个结构,使用上面写的'clearCircularBuffer'函数。我怎么能这样做?

void clear_sensors_struc (volatile struct_sens *sensors_struct)
{

sensors_struct->sensorFlag=0;
sensors_struct->tipoSensor=0;

    //NOW, HOW CAN I USE clearCircularBuffer to clean sensors_struct->                      
    //st_circular_buffer??

    //this way compiles fine, but i don´t think it´s correct
    clearCircularBuffer(&(sensors_struct->st_circular_buffer));

    //this way wouldn´t even compile
    clearCircularBuffer(sensors_struct->st_circular_buffer));
} 

最后,我有一个变量声明为:

struct_sens struct_sensores[MAX_NUMBER_OF_SENSORS];

我想写一个能清理那个结构数组的函数...... 那么我怎么能用'clear_sensors_struc'函数来做呢?

void clear_sensors_struc_array(struct_sens *sensors_struct)
{
    struct_sens aux_str[MAX_NUMBER_OF_SENSORS];  
    int i=0;    

    for(i=0;i<MAX_NUMBER_OF_SENSORS;i++)
    {         
        clear_sensors_struc(&aux_str[i]);
        *(sensors_struct+i)=aux_str[i];
    }
}

有没有办法在没有定义内部struct_sens aux_str?

的情况下这样做 好的,希望有人可以帮助我! 提前谢谢!

3 个答案:

答案 0 :(得分:3)

在函数clear_sensors_struc中,确实是正确的:

//this way compiles fine, but i don´t think it´s correct
clearCircularBuffer(&(sensors_struct->st_circular_buffer));

这是正确的,因为(在函数clear_sensors_struc内):

  • sensors_struct :是指向结构的指针。
  • sensors_struct->st_circular_buffer :取消引用sensors_struct(使用->)并允许您访问其成员st_circular_buffer
  • &(sensors_struct->st_circular_buffer) :是指向结构st_circular_buffer的成员sensors_struct的指针,恰好是结构struct_circ_buff

由于函数clearCircularBuffer需要一个指针,它将编译并正常工作。

关于清理结构数组的函数,这个怎么样?:

void clear_sensors_struc_array(struct_sens *sensors_struct)
{
    int i=0;    

    for(i=0;i<MAX_NUMBER_OF_SENSORS;i++)
    {         
        clear_sensors_struc((sensors_struct+i));
    }
}

答案 1 :(得分:1)

在Nicolas中,例如clearCircularBuffer(&amp;(sensors_struct-&gt; st_circular_buffer));

我们可以直接使用

clearCircularBuffer(安培; sensors_struct-&GT; st_circular_buffer);

- &GT;优先于&amp;

答案 2 :(得分:0)

1)首先,您没有正确定义结构。定义结构如下

 typedef struct one
 {
   unsigned char next;
   unsigned char first;
   unsigned long data[11]; 
 }struct_circ_buff;

 typedef struct two
 {
   volatile unsigned char sensorType;
   volatile int  sensorFlag;
   volatile struct_circ_buff st_circular_buffer;
 }struct_sens;

2)你问了

I would like to write a function that would clean this struct, using the 'clearCircularBuffer' function written above. How could I do that?您可以按照以下方式执行此操作

void clear_sensors_struc (volatile struct_sens *sensors_struct)
{

  int i;

  sensors_struct->sensorFlag=0;
  sensors_struct->sensorType=0;
  sensors_struct->st_circular_buffer.next=0;
  sensors_struct->st_circular_buffer.first=0;

  for(i=0;i<TCP_RX_BUFFER+1;i++)
  {
     sensors_struct->st_circular_buffer.data[i]=0;
  }    

}