Copia elementi array di tipo byte

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 :wink:

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. :+1:

...beh, ci mancherebbe altro, sono funzioni standard che usa tutto il mondo :smile:

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

1 Like

... 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 ... :roll_eyes:

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 ... :roll_eyes:

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.

1 Like

Ok ... mea-culpa, ammetto che non ricordavo che la sizeof lavorasse a compile-time :woozy_face: ... chiaramente allora è la strada migliore :grin:

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.

1 Like

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"