Salve, chiedo un piccolo aiuto.
devo copiareil contenuto di questo array:
const byte message[] = {0x95, 0x01, 0x00, 0x20, 0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 33};
in un'altro vuoto con le stesse dimensioni:
byte principale[17];
ho gia provato con un for
for(int i=0; i<17; i++){
message[i]=principale[i];
}
ma nn funziona...
qualche suggerimento?grazie
Stai assegnando all'array originale non si sa bene cosa, array che tra l'altro hai dichiarato const e quindi non è possibile modificarne i valori...
Mi sa che volevi scrivere
principale[i] = message[i] ;
... oppure, più velocemente che con un for, usare memcpy() che è presente in <string.h> libreria standard sempre inclusa ![]()
void * memcpy ( void * dest, const void * src, size_t len );
In cui 'dest' è l'array di destinazione, 'src' quello di partenza e 'len' il numero di bytes da copiare ... in pratica scrivere solo:
memcpy ( message, principale, 17);
Guglielmo
si hai ragione ho sbagliato a scrivere è su message che devo copiare i valori.
grazie, adesso provo.
Funziona,grazie 1000 Guglielmo. ![]()
...beh, ci mancherebbe altro, sono funzioni standard che usa tutto il mondo ![]()
Prova a guardare la AVR libc e considera che l'IDE di Arduino la include sempre tutta, quindi ... hai a disposizione tutto quello che vedi (su MCU della famiglia AVR, su altre famiglie alcune cose potrebbero essere diverse).
Guglielmo
Nessuno si è accorto che lo array di origine ha 18 elementi?
Questo è il tipico caso dove sizeof diventa più che utile; necessario
... più che altro questo è il tipico caso (dovendo dichiarere/usare DUE array) dove sarebbe stato bene mettere le dimensioni invece che le sole parentesi quadre, lasciandole calcolare al compilatore, così ... sarebbe saltato subito fuori l'assegnazione di 18 elementi ad un vettore di 17 ... ![]()
Guglielmo
Non sono d'accordo, il compilatore conta meglio dei nostri occhi e se hai 50 elementi che fai ti metti a contarli?
sizeof è pensato proprio per questo lavoro.
Ciao.
Certo, ma ... il problema è che deve poi copiarli in un altro vettore e quindi ... deve sapere come dimensionare il vettore destinazione ... ![]()
Guglielmo
Char vettore[sizeof vecchiovettore];
Esattamente, e lavora a compile-time:
byte dest[sizeof message];
Potrebbe benissimo usare:
#define MESSAGE_LEN (sizeof message)
e dichiarare dest così:
byte dest[MESSAGE_LEN];
Poi se uno non si fida del compilatore è un altro paio di maniche.
Ciao.
Ok ... mea-culpa, ammetto che non ricordavo che la sizeof lavorasse a compile-time
... chiaramente allora è la strada migliore ![]()
Guglielmo
All'utente che ha posto la domanda, RICORDIAMO però che questo uso di sizeof può essere fatto quando l'array è di byte o char. Se ad esempio l'array fosse di int (a 16 bits) non sarebbe corretto, bisognerebbe usare sizeof in maniera differente.
Sizeof array / sizeof array[0]
Se si leggono i miei varii argomenti ci si accorge che lo uso come il prezzemolo
Stavo per scrivere; che standard lo usa spesso. Mi sono fermato perché ho visto stavi scrivendo.
Comunque, questo lavora uguale:
size_t nElem = sizeof message / sizeof(byte);
Però la versione di standard è meno soggetta ad errori, questo perché il tipo dell'elemento base "byte" lo ricava il compilatore, mentre nella versione qui sopra spetta a me scrivere byte tra le parentesi.
Quindi la versione di standard:
size_t nElem = sizeof message / sizeof message[0];
La possiamo mettere in una macro così:
#define SIZE_OF_ARRAY(a) (sizeof a / sizeof a[0])
ed usare direttamente così:
Serial.println(SIZE_OF_ARRAY(message));
PS: anche strlen viene risolta a compile time, ma di questa esiste la funzione che viene chiamata a run-time quando il compilatore non ha elementi per risolvere a compile-time.
Ciao.
Segnalerei, per completezza, anche che:
When sizeof's operand is a type, it has to be enclosed in parentheses. But when sizeof's operand is a variable, this is not required. (From: Expert C Programming: Deep C secrets, and from c11 standard):
sizeof unary-expression
sizeof ( type-name )
Guglielmo
Io per non sbagliare uso sempre la forma con le parentesi sizeof(). Mi sento più "sicuro". ^-^
Non è un segreto poi così "profondo", visto che viene dritto dritto dal k&r
Io sospetto che molta gente abbia dimenticato molte cose
E che le stiano continuamente "re-inventando"