2013-07-29 12 views
5

सबसे पहले, मैं यह कहना चाहूंगा कि मैंने इस प्रश्न को पोस्ट करने से पहले इस मंच में उत्तर की खोज की है, लेकिन मुझे कोई जवाब नहीं मिला।किसी फ़ंक्शन में एक सूचक के रूप में एक स्ट्रक्चर सदस्य को पास करने के लिए

ठीक है, समस्या यह है कि मेरे पास एक संरचना है जो किसी अन्य (प्रमुख) संरचना का सदस्य है। मैंने पहली संरचना को साफ़ करने के लिए एक फ़ंक्शन लिखा है (यह संरचना के लिए एक सूचक लेता है)। मैं उस संरचना का उपयोग प्रमुख संरचना के अंदर संरचना को साफ़ करने के लिए करना चाहता हूं, लेकिन मुझे नहीं पता कि यह करने का सही तरीका क्या है। , तब

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

मैं:

मैं एक संरचना, है के रूप में परिभाषित:

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

और यह स्पष्ट करने के लिए एक समारोह

बेहतर व्याख्या करने के लिए, यहाँ कुछ कोड है एक और संरचना है जिसमें 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

से अधिक वरीयता दी जाती है '// इस तरह से ठीक संकलित है, लेकिन मुझे लगता है कि नहीं है यह है correct' <- ठीक है, यह सही _is_। –

+0

इससे मदद मिल सकती है: http://stackoverflow.com/questions/6851848/passing-struct-pointer-to-functions-not-working – R3D3vil

+0

क्यों आप struct_circle_buf की बजाय struct_sens में (strcut_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: एक struct के लिए सूचक है।
  • sensors_struct->st_circular_buffer: dereferences sensors_struct (-> का प्रयोग करके) और आप अपने सदस्य st_circular_buffer का उपयोग करने की अनुमति देता है।
  • &(sensors_struct->st_circular_buffer): struct sensors_struct के सदस्य st_circular_buffer कि एक struct struct_circ_buff होने के लिए सूचक है।

फ़ंक्शन clearCircularBuffer फ़ंक्शन के रूप में आवश्यक है, यह संकलित और सही काम करेगा।

structs की सरणी, क्या इस बारे में ?: सब आप सही तरीके से संरचनाओं निर्धारित नहीं किया है की

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

निकोलस में नीचे के रूप में यह कर सकते हैं जैसे: clearCircularBuffer (& (sensors_struct-> st_circular_buffer));

हम सीधे

clearCircularBuffer उपयोग कर सकते हैं (& sensors_struct-> st_circular_buffer);

-> &

संबंधित मुद्दे