2013-07-29 26 views
5

首先,我想說在發佈這個問題之前,我已經詳盡地在這個論壇中搜索了答案,但是我沒有找到任何答案。如何在函數中傳遞一個結構成員作爲指針

好的,問題是我有一個結構是另一個(主要)結構的成員。我寫了一個清除第一個結構的函數(它需要一個指向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?

好的,希望有人能幫助我! 在此先感謝!

+7

'//這樣編譯好,但我不認爲it's correct' < - 嗯,這_is_正確的。 –

+0

這可能有所幫助:http://stackoverflow.com/questions/6851848/passing-struct-pointer-to-functions-not-working – R3D3vil

+0

爲什麼不保存一個(strcut_circle_buf *)指針在struct_sens而不是struct_circle_buf中。事情很清楚。 –

回答

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(使用->),並允許您訪問其成員​​。
  • &(sensors_struct->st_circular_buffer):是一個指針,指向恰好是一個結構struct_circ_buff該結構sensors_struct的構件​​。

由於功能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)); 
    } 
} 
+0

非常感謝尼古拉斯的解釋! – Rodring

+0

函數clear_sensors_struc_array是什麼? –

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

} 
+0

它是清理struct_sens數組的好方法,但在這種情況下,我想充分利用'clearCircularBuffer'函數。當然,我可以像你說的那樣做,但問題基本上是關於結構和指針處理。 – Rodring

0

在薩科e.g clearCircularBuffer(&(sensors_struct-> st_circular_buffer));

我們可以直接使用

clearCircularBuffer(& sensors_struct-> st_circular_buffer);

- >得到優先&

相關問題