2013-07-29 35 views
5

Trước hết, tôi muốn nói rằng tôi đã tìm kiếm câu trả lời trong diễn đàn này trước khi đăng câu hỏi này, nhưng tôi không tìm thấy câu trả lời nào.Làm thế nào để vượt qua một thành viên cấu trúc như một con trỏ trong một hàm

OK, vấn đề là tôi có cấu trúc là thành viên của cấu trúc (chính) khác. Tôi đã viết một hàm để xóa cấu trúc đầu tiên (phải mất một con trỏ đến cấu trúc). Tôi muốn sử dụng chức năng đó để xóa cấu trúc bên trong cấu trúc chính, nhưng tôi không biết chính xác đó là cách chính xác để làm điều đó.

Để giải thích nó tốt hơn, đây là một số mã:

Tôi đã một cấu trúc, định nghĩa là:

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

và một chức năng để xóa nó:

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

Sau đó, tôi có cấu trúc khác bao gồm struct_circ_buff:

typedef struct 
{ 
    volatile unsigned char sensorType; 
    volatile uint16_t sensorFlag; 
    volatile struct_circ_buff st_circular_buffer; 
}struct_sens; 

và tôi muốn viết một hàm có thể làm sạch cấu trúc này, sử dụng hàm 'clearCircularBuffer' được viết ở trên. Làm thế nào tôi có thể làm điều đó?

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

Cuối cùng, tôi đã một biến khai báo là:

struct_sens struct_sensores[MAX_NUMBER_OF_SENSORS]; 

và tôi muốn viết một hàm có thể làm sạch được mảng các cấu trúc ... Vậy làm thế nào tôi có thể sử dụng 'clear_sensors_struc' chức năng để làm điều đó?

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

Có cách nào để làm điều đó mà không xác định cấu trúc bên trong aux_str?

OK, hy vọng ai đó có thể giúp tôi! Cảm ơn bạn trước!

+7

'// cách này biên dịch tốt, nhưng tôi không nghĩ Nó rất correct' <- Vâng, nó _is_ đúng. –

+0

Điều này có thể giúp: http://stackoverflow.com/questions/6851848/passing-struct-pointer-to-functions-not-working – R3D3vil

+0

Tại sao bạn không lưu con trỏ (strcut_circle_buf *) trong struct_sens thay vì struct_circle_buf. Mọi thứ trở nên rõ ràng. –

Trả lời

3

Bên trong chức năng clear_sensors_struc, nó thực sự là đúng để làm:

//this way compiles fine, but i don´t think it´s correct 
clearCircularBuffer(&(sensors_struct->st_circular_buffer)); 

Đó là đúng vì (bên trong chức năng clear_sensors_struc):

  • sensors_struct: là một con trỏ đến một cấu trúc.
  • sensors_struct->st_circular_buffer: dereferences sensors_struct (sử dụng ->) và cho phép bạn truy cập thành viên st_circular_buffer.
  • &(sensors_struct->st_circular_buffer): là một con trỏ tới các thành viên st_circular_buffer của struct sensors_struct điều đó xảy ra là một struct struct_circ_buff.

Khi chức năng clearCircularBuffer yêu cầu một con trỏ, nó sẽ biên dịch và hoạt động bình thường.

Về chức năng để làm sạch các mảng của cấu trúc, những gì về vấn đề này ?:

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

Cảm ơn Nicolas rất nhiều vì lời giải thích! – Rodring

+0

Còn chức năng 'clear_sensors_struc_array' thì sao? –

0

1) Trước hết bạn chưa xác định cấu trúc một cách chính xác. xác định các cấu trúc như sau

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) Và bạn hỏi

I would like to write a function that would clean this struct, using the 'clearCircularBuffer' function written above. How could I do that? bạn có thể làm điều đó như sau

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

Một cách tốt để làm sạch mảng struct_sens, nhưng trong trường hợp này, tôi muốn tận dụng tối đa chức năng 'clearCircularBuffer'. Tất nhiên tôi có thể làm điều đó như bạn đã nói, nhưng câu hỏi về cơ bản là về cấu trúc và con trỏ đang xử lý. – Rodring

0

Trong Nicolas ví dụ clearCircularBuffer (& (sensors_struct-> st_circular_buffer));

chúng ta có thể trực tiếp sử dụng

clearCircularBuffer (& sensors_struct-> st_circular_buffer);

-> sẽ được ưu tiên hơn &

Các vấn đề liên quan