Dubbio su passaggio di puntatore a struttura
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
ho una funzione che all'interno ne richiama una seconda
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
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
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
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
Risposte
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.
Tutto chiaro
grazie mille
grazie mille

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.