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;
fonte
2015-09-03 12:56:49
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. –