D2009 problemi con array di caratteri - come posso `elegantemente` riparare il mio codice?
-
03-07-2019 - |
Domanda
Analizzando alcuni dei miei vecchi progetti Delphi e aggiornandoli a D2009, trovando questa versione un grande miglioramento (Generics.Collections - wow!;)) rispetto a tutte le versioni precedenti, ho riscontrato vari problemi. Questo sono riuscito a risolvere, ma la soluzione non sembra la metà elegante di quanto credo possa essere. (Nota, non scrivo il codice Delphi da circa tre anni e anche allora era un hacking piuttosto amatoriale che una comprensione approfondita di ciò che sta succedendo).
Il mio codice dovrebbe avere un TFileStream e leggere da esso. I file sono stati scritti in precedenza dalla mia vecchia app Delphi in modo che i primi tre caratteri nel file fossero CTR per riconoscere il tipo di file come valido. Il lettore leggeva nei primi tre byte in una matrice di caratteri (ed ecco il problema, ora che sizeof (char) è 2 byte) e quindi tratta questa matrice come stringa per vedere se legge "CTR".
var ...
buffer: array[0..2] of char;
begin
...
InStream.read(buffer, 3);
if buffer <>'CTR' then begin ShowMessage('Not a valid file!'); exit; end;
...
Questo verrà compilato e funzionava, ma ora il buffer è praticamente lungo 6 byte e quindi non equivale a "CTR" mai .
Ho risolto questo problema modificando il buffer in array [0..2] di byte
e ho introdotto alcune altre variabili locali per fare quanto segue:
for b in buffer do s := s + chr(b); //notice the for..in loop now available in D2009
if s<>'CTR'...
Quindi in pratica trasformo i singoli byte in una stringa e poi faccio il confronto, ma ci deve essere un modo più semplice per farlo. Puoi per favore far luce su questo problema?
Soluzione
È possibile impostare il buffer su
var
buffer: array[0..2] of AnsiChar;
e leggerai esattamente la stessa cosa di prima.