Puntatori a struttura da passare ad una funzione

di il
20 risposte

Puntatori a struttura da passare ad una funzione

Buon giorno a tutti. Sono nuovo di questo forum, spero di non far errori di compilazione (ho letto le regole... ma si sa mai )

in un progetto ho la necessità di chiamare questa funzione:
void RTC_StructInit(RTC_InitTypeDef* RTC_InitStruct)
{
  /* Initialize the RTC_HourFormat member */
 
  RTC_InitStruct->RTC_HourFormat = RTC_HourFormat_24;
  /* Initialize the RTC_AsynchPrediv member */
  RTC_InitStruct->RTC_AsynchPrediv = (uint32_t)0x7F;

  /* Initialize the RTC_SynchPrediv member */
  RTC_InitStruct->RTC_SynchPrediv = (uint32_t)0xFF;
}
dove RTC_InitTypeDef è una struttura di questo tipo:

typedef struct
{
  uint32_t RTC_HourFormat;   /*!< Specifies the RTC Hour Format.
                             This parameter can be a value of @ref RTC_Hour_Formats */
  
  uint32_t RTC_AsynchPrediv; /*!< Specifies the RTC Asynchronous Predivider value.
                             This parameter must be set to a value lower than 0x7F */
  
  uint32_t RTC_SynchPrediv;  /*!< Specifies the RTC Synchronous Predivider value.
                             This parameter must be set to a value lower than 0x1FFF */ 
}RTC_InitTypeDef;


Nel mio main devo chiamare la funzione sopra per aggiornare i campi di questa struttura.

Quindi io scrivo :

 RTC_InitTypeDef  mia_struct;
 RTC_InitTypeDef *dor; //puntatore a struttura
dor = (&mia_struct); // assegno l'indirizzo della struttra al puntatore
//mia_struct->RTC_HourFormat = 0x01;
RTC_StructInit((RTC_InitTypeDef*) dor);
a questa ultima istruzione ottengo errore di compilazione "conflicting types for dor"
Perchè?
Come posso istanziare una struttura di tipo RTC_InitTypeDef da passare alla funzione?

Grazie

PS: il compilatore usato è un comp per ARM , ma non penso sia un problema di compilatore bensì di linguaggio

20 Risposte

  • Re: Puntatori a struttura da passare ad una funzione

    
    RTC_StructInit(dor);
    oppure
    RTC_StructInit(&mia_struct);
    
  • Re: Puntatori a struttura da passare ad una funzione

    Grazie per la risposta, ma non funziona:
    a) su questa istruzione il compilatore dà errore:
     
    dor = (&mia_struct);
    
    b) se commento l'istruzione sopra il compilatore non dà errore ma poi il membro della struttura non viene aggiornato correttamente.

    Come mai?

    grazie
  • Re: Puntatori a struttura da passare ad una funzione

    giamby3000 ha scritto:


    Grazie per la risposta, ma non funziona:
    a) su questa istruzione il compilatore dà errore:
     
    dor = (&mia_struct);
    
    Vista così sembra corretta, solo che generalmente lo si scrive senza le parentesi, oppure con l'operatore '&' dentro alla parentesi,

    Che errore ti dà, letteralmente? Di che compilatore stiamo parlando?

    giamby3000 ha scritto:


    b) se commento l'istruzione sopra il compilatore non dà errore ma poi il membro della struttura non viene aggiornato correttamente.

    Come mai?
    Questo è abbastanza semplice.
    'dor' è un puntatore, ovvero un "riferimento". Quando tu operi su 'dor', in realtà stai modificando l'oggetto a cui 'dor' si riferisce. L'istruzione
    dor = (&mia_struct);
    non fa altro che specificare che 'dor' si riferisce a 'mia_struct', che è l'oggetto vero e proprio. Se tu la commenti, dor non viene inizializzato, ovvero non "si riferirà a nulla".
    O meglio si riferirà a qualcosa di casuale, che abbastanza sicuramente non sarà 'mia_struct'!

    Michele
  • Re: Puntatori a struttura da passare ad una funzione

    Conflicting types for dor

    Questo è l'errore restituito

    grazie
  • Re: Puntatori a struttura da passare ad una funzione

    L'unica ipotesi che mi viene in mente è che esista già un oggetto chiamato 'dor' di tipo diverso.

    In questo caso il compilatore divrebbe darti qualcosa tipo:
    $ cc main.c 
    main.c:4: error: conflicting types for ‘dor’
    /usr/include/xxx.h:651: note: previous declaration of ‘dor’ was here
    
    È solo un'ipotesi...

    Michele
  • Re: Puntatori a struttura da passare ad una funzione

    Grazie, ma non è questo il caso dato che ho cambiato più volte questo nome (c'avevo già pensato ad un possibile duplicato...) peraltro facendo la ricerca del testo in tutto il workspace non esiste nulla fuorchè questo...
  • Re: Puntatori a struttura da passare ad una funzione

    Crea il + piccolo progetto dove si manifesta l'errore e posta. cosi tutti possiamo controllare.
  • Re: Puntatori a struttura da passare ad una funzione

    Ho provato anche con un altro compilatore ed a fronte delle tre stesse righe di codice ovvero queste:
    
    RTC_InitTypeDef  mia_struct;
    RTC_InitTypeDef *dor; //puntatore a struttura
    dor = (&mia_struct); // assegno l'indirizzo della struttra al puntatore
    
    


    restituisce i seguenti errori

    this declaration has no storage class or type specifier
    declaration incompatible with "RTC_InitTypeDef *dor"
    a value of type "RTC_InittypeDef*" cannot be used to initialize an entity of type int

    su questa ultima segnalazione ho dei dubbi: an entity a cui mi riferisco è di tipo InittypeDef, non è int!!! I suoi membri sono int 32, ma la struct è di questo tipo....



    se invece commento l'ultima riga:
    
    
    
    RTC_InitTypeDef  mia_struct;
    RTC_InitTypeDef *dor; //puntatore a struttura
    [color=#008000]//dor = (&mia_struct); // assegno l'indirizzo della struttra al puntatore[/color]
    
    
    e accedo alla struttura con l'operatore "." ovvero
    
    mia_struct.RTC_HourFormat = 0x01;
    
    
    la cosa ovviamente funziona ed effettivamente nel membro ho 0x01 in esecuzione (accedo direttamente al membro della struttura) ma non è quello che voglio ottenere.
  • Re: Puntatori a struttura da passare ad una funzione

    skynet ha scritto:


    crea il + piccolo progetto dove si manifesta l'errore e posta. cosi tutti possiamo controllare.

    appena riesco lo faccio; sto cercando di utilizzare dei file di esempio che il fornitore di chip dà a corredo della evaluation board per testare le varie funzioalità; la funzione che devo chiamare da main (vedi sopra) e che consente di aggiornare questa benedetta struttura è contenuta in altro file .c
  • Re: Puntatori a struttura da passare ad una funzione

    Ecco la prova che ho fatto io. Visual Studio non accetta i uint_32 (non supporta il C99 quindi li ho cambiati in unsigned int ma il discorso non cambia). Ho creato questi file:
    1. struct.h definito così
    
    #ifndef __STRUCT_H_
    #define __STRUCT_H_
    
    typedef struct
    {
    	  unsigned int RTC_HourFormat;  
    	  unsigned int RTC_AsynchPrediv;	 
    	  unsigned int RTC_SynchPrediv; 
    }RTC_InitTypeDef;
    
    #endif 
    
    2. func.h contine la funzione sopra definita così
    
    #ifndef func_h__
    #define func_h__
    
    #include "struct.h"
    
    #define RTC_HourFormat_24 0x1
    
    void RTC_StructInit(RTC_InitTypeDef* RTC_InitStruct);
    #endif // func_h__
    
    Ho messo #define RTC_HourFormat_24 0x1 perche non ho idea che tipo di dato questo sia siccome non hai specificato.

    3. func.c (sviluppo della funzione definita in func.h)
    
    #include "func.h"
    
    void RTC_StructInit(RTC_InitTypeDef* RTC_InitStruct)
    {
    	/* Initialize the RTC_HourFormat member */
    
    	RTC_InitStruct->RTC_HourFormat = RTC_HourFormat_24;
    	/* Initialize the RTC_AsynchPrediv member */
    	RTC_InitStruct->RTC_AsynchPrediv = (unsigned int)0x7F;
    
    	/* Initialize the RTC_SynchPrediv member */
    	RTC_InitStruct->RTC_SynchPrediv = (unsigned int)0xFF;
    }
    
    4. main
    
    #include "func.h"
    
    int main() {
    	RTC_InitTypeDef  mia_struct;
    	RTC_InitTypeDef *dor; //puntatore a struttura
    	dor = &mia_struct; // assegno l'indirizzo della struttra al puntatore
    	
    	RTC_StructInit(dor);
    
    
    	return 0;
    }
    
    NESSUN PROBLEMA. Quindi c'è qualcosa che non va con le tue impostazioni e la visibilità delle definizioni strutture.

    Edit: vedi anche quà:
    Si inizializzano sia il puntatore che la variabile mia struct all'uscita della funzione:
    Allegati:
    7532_816d24a4df5af59d6bbd065eaf5cf7f0.jpg
    7532_816d24a4df5af59d6bbd065eaf5cf7f0.jpg
  • Re: Puntatori a struttura da passare ad una funzione

    Grazie mille... da un lato sono contento... cominciavo a dubitare della mia preparazione in C
    la variabile membro è ok , nella fattispecie è un int32_t andrebbe castata ma non è qui il probolema. Il tuo esempio è esattamente la situazione in cui sono , ma i miei compilatori "2" danno errore...

    su questo
    c'è qualcosa che non va con le tue impostazioni e la visibilità delle definizioni strutture
    qualche consiglio?
  • Re: Puntatori a struttura da passare ad una funzione

    Vedi se c'è qualche impostazione del compilatore e/o linker per metterlo in modalità verbose (ti elenca tutti i passaggi che sta faccendo). Così vedi se va a pescare dove non deve o sa ha dei path sbagliati.
  • Re: Puntatori a struttura da passare ad una funzione

    Potresti provare a memorizzare la variabile nell'Heap, anzichè nello Stack. Magari non centra molto con il problema sollevato dal compilatore, ma potrebbe aiutarti ad aggirarlo.

    Al posto di:
    RTC_InitTypeDef  mia_struct;
    RTC_InitTypeDef *dor; //puntatore a struttura
    dor = (&mia_struct); // assegno l'indirizzo della struttra al puntatore
    
    RTC_StructInit(dor);
    Prova a mettere:
    RTC_InitTypeDef *dor; //puntatore a struttura
    dor = (RTC_InitTypeDef *) malloc( sizeof( RTC_initTypeDef ) ); // alloca spazio in memoria Heap
    
    RTC_StructInit( dor);
    Usando questo codice, però, ti devi ricordare che quando non usi più la struttura devi rilasciare lo spazio allocato con:
    free(dor); // dealloca lo spazio in memoria puntato da dor
  • Re: Puntatori a struttura da passare ad una funzione

    Grazie per il consiglio. Avevo già provato con la malloc ma ancora avevo problemi di compilazione... esattamente non ricordo l'errore ... ora riprovo


    RTC_InitTypeDef *dor; //puntatore a struttura
    dor = (RTC_InitTypeDef *) malloc( sizeof( RTC_initTypeDef ) ); // alloca spazio in memoria Heap

    Niente da fare ancora errori di compilazione :
    Allegati:
    8903_92609807f923fdedd1a9417f9b6b9dc5.png
    8903_92609807f923fdedd1a9417f9b6b9dc5.png
Devi accedere o registrarti per scrivere nel forum
20 risposte