2015-09-03 9 views
5

Dati i seguenti:modo corretto per copiare i dati da Tbyte a matrice di byte in Delphi

LBytes: TBytes; 
LArr: array[1..512] of Byte; 
... 
SetLength(LBytes, 512); 

Qual è la mossa corretta() chiamata per copiare tutti i byte da LBytes a Larr?

Move(LBytes[0], LArr, Length(LBytes)); // works 

Move(LBytes[0], LArr[1], Length(LBytes)); // works, too 

Move(LBytes, LArr[1], Length(LBytes)); // fail 

Qualcuno può spiegare perché non fa alcuna differenza tra l'utilizzo Larr e Larr [1], ma fa la differenza tra LBytes [0] e LBytes?

+0

LBytes -> punti al puntatore del Tbyte, LBytes [0] punta al primo elemento . LArr è una matrice di dimensioni fisse e quindi è LArr e LArr [1] uguali (ad esempio, punta al primo elemento). I primi due sono quindi corretti. Usa quello che trovi più leggibile. –

risposta

7

Qualcuno può spiegare perché non fa alcuna differenza tra l'utilizzo Larr e Larr 1 ma fa la differenza tra LBytes [0] e LBytes?

Questo perché LBytes è un array dinamico che è, in definitiva, un puntatore all'array. D'altra parte, LArr è la matrice.

Un altro modo per dire questo è che gli array dinamici sono tipi di riferimento e gli array di lunghezza fissa sono tipi di valore.

Nel mio libro, ci sono due vie percorribili per farlo:

Assert(Length(LBytes)<=Length(LArr)); 
Move(LBytes[0], LArr, Length(LBytes)); 

o

Assert(Length(LBytes)<=Length(LArr)); 
Move(Pointer(LBytes)^, LArr, Length(LBytes)); 

Io preferisco il secondo, perché è resistente a un array di lunghezza zero quando il controllo gamma è abilitato. In questo scenario, il primo blocco di codice genera un errore di controllo dell'intervallo di tempo di esecuzione.

Potresti anche essere motivato ad evitare tali trucchi di basso livello. Ho un utility class che mi permette di scrivere:

TArray.Move<Byte>(LBytes, LArr); 

La firma del metodo è:

class procedure Move<T>(const Source: array of T; var Dest: array of T); overload; static; 
+0

Mi piace la classe di utilità Move . Questa unità è disponibile? –

+0

@RitsaertHornstra http://stackoverflow.com/a/15924484/505088 –

Problemi correlati