C 如何在函数中将结构成员作为指针传递?

C 如何在函数中将结构成员作为指针传递?,c,C,问题是我有一个结构是另一个(主要)结构的成员。我编写了一个函数来清除第一个结构(它使用指向结构的指针) 我想用这个函数来清除主结构中的结构,但我不知道哪种方法是正确的 为了更好地解释它,下面是一些代码: 我有一个结构,定义为: typedef struct { unsigned char next; unsigned char first; unsigned long data[TCP_RX_BUFFER+1]; }struct_circ_buff; 和一个清除它的函

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

我想用这个函数来清除主结构中的结构,但我不知道哪种方法是正确的

为了更好地解释它,下面是一些代码:

我有一个结构,定义为:

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;
}
我想用上面写的
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];
我想写一个函数来清理这个数组的结构

那么,我如何使用
清除传感器结构
功能来实现这一点呢

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];
    }
}
无效清除传感器结构阵列(结构传感器*传感器结构)
{
结构传感器辅助传感器[传感器的最大数量];
int i=0;

对于(i=0;i在功能
清除传感器结构
内,确实正确的做法是:

//this way compiles fine, but i don´t think it´s correct
clearCircularBuffer(&(sensors_struct->st_circular_buffer));
这是正确的,因为(内部功能
clear\u sensors\u struc
):

  • sensors\u struct
    :是指向结构的指针
  • sensors\u struct->st\u circular\u buffer
    :取消引用
    sensors\u struct
    (使用
    ->
    ),并允许您访问其成员
    st\u circular\u buffer
  • &(sensors\u struct->st\u circular\u buffer)
    :指向结构
    sensors\u struct
    的成员
    st\u circular\u buffer
    ,该成员恰好是结构
    结构的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));
    }
}
无效清除传感器结构阵列(结构传感器*传感器结构)
{
int i=0;
对于(i=0;i
  • 首先,您没有正确定义结构。请按以下方式定义结构:

    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;
    
    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;
        }    
    } 
    
  • 你问:

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

    您可以按以下方式进行操作:

    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;
    
    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;
        }    
    } 
    
    void clear\u sensors\u struct(易失性结构*传感器结构)
    {
    int i;
    传感器结构->传感器标志=0;
    传感器结构->传感器类型=0;
    传感器结构->st\U循环缓冲区。下一步=0;
    传感器结构->st\U循环缓冲区。第一个=0;
    对于(i=0;ist\u循环\u buffer.data[i]=0;
    }    
    } 
    
  • 根据尼古拉斯的例子:

    clearCircularBuffer(&(sensors_struct->st_circular_buffer));
    
    我们可以直接使用

    clearCircularBuffer(&sensors_struct->st_circular_buffer);
    

    因为
    ->
    优先于
    &

    //这种方式编译起来很好,但我认为它不正确
    这可能会有帮助:为什么不保存(struct\u circle\u buf*)指针指向结构而不是圆形。事情很清楚。@DanielFischer,谢谢你的阅读和回答!Nisarg:谢谢!我已经看到了那篇文章,我从中得到了一些积极的东西,但我的情况略有不同。李东国:谢谢你的建议;我将分析它。非常感谢你Nicolas f或者解释!这是清理struct_sens数组的一种好方法,但在本例中,我想充分利用“clearCircularBuffer”函数。当然,我可以像你说的那样做,但问题基本上是关于结构和指针处理的。