7

問題は、別の (主要な) 構造体のメンバーである構造体があることです。最初の構造体をクリアする関数を作成しました (構造体へのポインターが必要です)。

その関数を使用して主要な構造内の構造体をクリアしたいのですが、どちらが正しい方法なのか正確にはわかりません。

それをよりよく説明するために、ここにいくつかのコードがあります:

次のように定義された構造があります。

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 を定義せずにそれを行う方法はありますか?

4

3 に答える 3

4

function 内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: structsensors_structである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));
    }
}
于 2013-07-29T15:52:36.453 に答える
2

ニコラスの例:

clearCircularBuffer(&(sensors_struct->st_circular_buffer));

直接使用できます

clearCircularBuffer(&sensors_struct->st_circular_buffer);

->よりも優先されるため&です。

于 2016-03-07T23:22:24.447 に答える