【问题标题】:How to pass a struct member as a pointer in a function?如何将结构成员作为指针传递给函数?
【发布时间】:2013-07-29 15:32:57
【问题描述】:

问题是我有一个结构是另一个(主要)结构的成员。我写了一个函数来清除第一个结构(它需要一个指向结构的指针)。

我想使用该函数来清除主要结构中的结构,但我不知道究竟哪种方法是正确的。

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

我有一个结构,定义为:

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 的情况下做到这一点?

【问题讨论】:

  • //this way compiles fine, but i don´t think it´s correct 是正确的。
  • 这可能会有所帮助:stackoverflow.com/questions/6851848/…
  • 为什么不在 struct_sens 中保存 (strcut_circle_buf *) 指针而不是 struct_circle_buf 。事情变得清晰了。
  • @DanielFischer,感谢您的阅读和回答!尼萨尔:谢谢!我已经看过那个帖子,我从中得到了一些积极的东西,但我的情况略有不同。郭立冬:谢谢你的建议;我来分析一下。

标签: c


【解决方案1】:

在函数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-&gt;st_circular_buffer:取消引用sensors_struct(使用-&gt;)并允许您访问其成员st_circular_buffer。
  • &amp;(sensors_struct-&gt;st_circular_buffer):是指向结构体sensors_struct 的成员st_circular_buffer 的指针,该结构体恰好是结构体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));
    }
}

【讨论】:

  • 非常感谢 Nicolas 的解释!
【解决方案2】:

尼古拉斯的例子:

clearCircularBuffer(&(sensors_struct->st_circular_buffer));

我们可以直接使用

clearCircularBuffer(&sensors_struct->st_circular_buffer);

因为-&gt; 优先于&amp;。

【讨论】:

    【解决方案3】:
    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. 你问:

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

      你可以这样做:

      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;
          }    
      } 
      

    【讨论】:

    • 这是清理struct_sens数组的好方法,但在这种情况下,我想充分利用'clearCircularBuffer'函数。我当然可以按照你说的做,但问题基本上是关于结构和指针处理的。
    猜你喜欢
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2021-11-29
    • 2012-08-01
    相关资源
    最近更新 更多