Pagina 1 di 1

Dubbio su passaggio di puntatore a struttura

MessaggioInviato: 25/09/2018, 08:45
da Summerwind78
Ciao a tutti


durante un'intensa sessione di programmazione mi è sorto un dubbio amletico su il passaggio di un puntatore in C

Premetto che sto lavorando con il compilatore C18 della microchip

io ho una struttura

Codice:
typedef struct {
   unsigned long identifier;
   unsigned char data[8];
   unsigned char type; //1 = IDE   0=standard
   unsigned char length; // data length
   unsigned char RTR; //Remote flag. 1 it means remote frame
} typCANmessage;


ho una funzione che all'interno ne richiama una seconda

Codice:
unsigned char can20b_CAN_read_message(typCANmessage *msg)
{
   ECAN_RX_MSG_FLAGS flags;
   
   if (ECANReceiveMessage(msg->identifier, msg->data, msg->length, &flags) == TRUE)
   {
      //to do
   }
}


il mio dubbio in questo momento è il seguente
alla funzione can20b_CAN_read_message io passo il puntatore ad una variabile msg di tipo typCANmessage... fino qui ok
ma quando alla funzione ECANReceiveMessage io passo come parametro per esempio msg->identifier, sto passando il puntatore a msg->identifier oppure il contenuto.

Mi confondo in quando la funzione principale riceve un puntatore e non una variabile

Qualcuno saprebbe chiarirmi la questione?

Grazie a tutti

Re: Dubbio su passaggio di puntatore a struttura

MessaggioInviato: 25/09/2018, 11:09
da vict85
Dipende dalla funzione in questione. In questo caso passi una variabile, ovvero quella contenuta all'indirizzo msg+offset (dalla struttura suppongo che offset = 0). Ovviamente puoi anche chiedere al compilatore di produrti il codice asm annotato.

Re: Dubbio su passaggio di puntatore a struttura

MessaggioInviato: 25/09/2018, 13:46
da Summerwind78
Tutto chiaro


grazie mille
:-D

Re: Dubbio su passaggio di puntatore a struttura

MessaggioInviato: 27/09/2018, 09:24
da apatriarca
Il fatto che msg sia passato per puntatore o come copia non ha alcun effetto su quello che viene passato a ECANReceiveMessage. Siccome ECANReceiveMessage riceve un intero allora msg->identifier sarà il valore intero contenuto nella variabile, msg->data sarà il puntatore all'array data e così via. Alla fin fine msg->identifier è solo una scrittura alternativa per (*msg).identifier. L'unica differenza tra le due situazioni è che se passi un puntatore, allora il puntatore msg->data sarà anche il puntatore al corrispondente array nella variabile passata come argomento. Se fosse stato passato come copia, sarebbe stato un puntatore ad una variabile locale alla funzione e quindi le modifiche non sarebbero state propagate al di fuori di essa.