2013-07-29 21 views
5

Przede wszystkim chciałbym powiedzieć, że wyczerpująco szukałem odpowiedzi na tym forum przed wysłaniem tego pytania, ale nie znalazłem żadnej odpowiedzi.Jak przekazać element członkowski struktury jako wskaźnik w funkcji

OK, problem polega na tym, że mam strukturę, która jest członkiem innej (głównej) struktury. Napisałem funkcję, aby wyczyścić pierwszą strukturę (pobiera wskaźnik do struktury). Chciałbym użyć tej funkcji do wyczyszczenia struct wewnątrz głównej struktury, ale nie wiem dokładnie, który jest prawidłowy sposób to zrobić.

Aby wyjaśnić to lepiej, tu jest jakiś kod:

Mam strukturę, zdefiniowana jako:

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

i funkcją, aby je wyczyścić:

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

Potem mają inną strukturę, która zawiera struct_circ_buff:

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

i chciałbym napisać funkcję, która wyczyściłaby tę strukturę, używając funkcji "clearCircularBuffer" zapisanej powyżej. Jak mogłem to zrobić?

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

Wreszcie, mam zmienne zadeklarowane jako:

struct_sens struct_sensores[MAX_NUMBER_OF_SENSORS]; 

i chciałbym napisać funkcję, która będzie czysta, że ​​tablicę struktur ... Więc jak mógłbym użyć „” clear_sensors_struc funkcja to zrobić?

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

Czy jest jakiś sposób robienia tego bez zdefiniowania wewnętrznego struct_sens aux_str?

Dobra, mam nadzieję, że ktoś może mi pomóc! Z góry dziękuję!

+7

'// ten sposób zestawia w porządku, ale nie sądzę its correct' <- Dobrze, to _jest_ poprawne. –

+0

Może to pomóc: http://stackoverflow.com/questions/6851848/passing-struct-pointer-to-functions-not-working – R3D3vil

+0

Dlaczego nie zapisujesz wskaźnika (strcut_circle_buf *) w struct_sens zamiast struct_circle_buf. Wszystko idzie jasno. –

Odpowiedz

3

Wewnątrz funkcji clear_sensors_struc, to jest rzeczywiście poprawna zrobić:

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

To prawda, ponieważ (wewnątrz funkcji clear_sensors_struc):

  • sensors_struct: jest wskaźnikiem do struktury.
  • sensors_struct->st_circular_buffer: dereferences sensors_struct (używając ->) i pozwala na dostęp do jego członkiem st_circular_buffer.
  • &(sensors_struct->st_circular_buffer): to wskaźnik do członka st_circular_buffer od struktury sensors_struct że dzieje się struct struct_circ_buff.

Ponieważ funkcja clearCircularBuffer wymaga wskaźnika, skompiluje się i będzie działać poprawnie.

Jeśli chodzi o funkcję, aby oczyścić tablicę kodowanym, co o tym ?:

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

Dziękuję Nicolasowi za wyjaśnienie! – Rodring

+0

Co z funkcją 'clear_sensors_struc_array'? –

0

1) Przede wszystkim nie zdefiniowano struktur poprawnie. określenie struktury jak poniżej

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 zapytał

I would like to write a function that would clean this struct, using the 'clearCircularBuffer' function written above. How could I do that? można to zrobić jak poniżej

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

Jest to dobry sposób czyszczenia tablicy struct_sens, ale w tym przypadku chciałbym w pełni wykorzystać funkcję "clearCircularBuffer". Oczywiście mogłem to zrobić tak jak powiedziałeś, ale pytanie dotyczyło głównie struktury i wskaźników. – Rodring

0

wchodzi Nicolas np clearCircularBuffer (& (sensors_struct-> st_circular_buffer));

można bezpośrednio użyć

clearCircularBuffer (& sensors_struct-> st_circular_buffer);

-> dostaje pierwszeństwo nad &

Powiązane problemy