Vai al contenuto
PLC Forum


Funzione Che Restituisce Una Struttura - Microchip C18


Neway

Messaggi consigliati

E' dal primo pomeriggio che cerco di creare una funzione che restituisca una struttura. Ho capito che bisogna restituire il puntatore alla struttura, ma non ho ben capito come fare. Potreste farmi qualche esempio per favore?

Grazie dell'aiuto

Link al commento
Condividi su altri siti


I puntatori alla struttura si dichiarano ponendo * prima del nome della variabile struttura.

 struct ind *ind_punt;
struct conto{
                   float bilancio;
                   char nome [10];
        } persona;

 p = &persona;

con l'istruzione p = &persona si pone l'indirizzo della variabile persona nel puntatore "p". per accedere all'elemento bilancio, p.e., si usa (*p).bilancio.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Un possibile modo per farlo è definire un tipo di dato Struttura che contiene diversi campi a loro volta di tipi diversi e una variabile MIA_STRUTTURA di tipo Struttura

typedef struct Struttura{
	unsigned int  campo1;
	long int  campo2;
        unsigned char	campo3;	
        unsigned  	campo_da_1bit  :1;	
}MIA_STRUTTURA;
A questo punto puoi definire un puntatore
unsigned char *p;
e farlo puntare a un qualunque campo della struttura
	p = &MIA_STRUTTURA.campo2;
oppure una qualsiasi funzione o istruzione può usare i campi della struttura direttamente
MIA_STRUTTURA.campo2 = 0;
if (MIA_STRUTTURA.campo2 == 0)
{.......}
Tipicamente l'utilizzo di un puntatore è utile se sulla struttura o su un campo della struttura a sua volta composto da più locazioni di memoria (array, stringa etc) hai bisogno di scandire i singoli elementi. Ad esempio immagina di avere una struttura che si chiama SERIALE che usi per la comunicazione seriale dentro la quale hai dei campi che usi per controllare la comunicazione ad esempio un campo SERIALE.STATUS e un buffer di x elementi SERIALE.DATI[x] dove metti i dati che trasmetterai, per riempire il buffer SERIALE.DATI con i dati presi da un'altra struttura (STRUTTURA_DATI_ORIGINE) puoi puntare a SERIALE.DATI[0]
        unsigned char *p;
	p = &SERIALE.DATI[0];
e poi con un ciclo sulla struttura di origine riempire il tuo buffer usando il puntatore al buffer
        for (i=0; i<DIM_STRUTTURA_DATI_ORIGINE;i++)
{
	*p++ = STRUTTURA_DATI_ORIGINE[i];
}

Link al commento
Condividi su altri siti

Parlando di strutture aggiungo una cosa molto carina che non conoscevo e che ho dovuto utilizzare di recente.

Per conoscere l'offset in bytes di un campo all'interno di una struttura si può utilizzare la macro

#define offsetof(type, mem) ((size_t) \
                            ((char *)&((type *)0)->mem - (char *)(type *)0))
che restituisce l'offset in bytes del campo indicato qualunque sia l'allineamento della struttura. Ad esempio
typedef struct Struttura{
       char campo1;
       unsigned campo2;
}MIA_STRUTTURA;

unsigned offs = offsetof(MIA_STRUTTURA, campo2));

offs per un compilatore 8 bit probabilmente vale 1

su un compilatore 32bit in assenza di altre direttive probabilmente offs = 4

con questa macro però il calcolo è sempre corretto qualunque sia il compilatore o la sua configurazione

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...