Neway Inserito: 22 agosto 2011 Segnala Inserito: 22 agosto 2011 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
Livio Orsini Inserita: 23 agosto 2011 Segnala Inserita: 23 agosto 2011 (modificato) 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: 23 agosto 2011 da Livio Orsini
alfa_e_omega Inserita: 26 agosto 2011 Segnala Inserita: 26 agosto 2011 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]; }
accacca Inserita: 26 agosto 2011 Segnala Inserita: 26 agosto 2011 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 1su un compilatore 32bit in assenza di altre direttive probabilmente offs = 4con questa macro però il calcolo è sempre corretto qualunque sia il compilatore o la sua configurazione
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora