@Rajko
>Zar nije brze (bolje) sa nizom karaktera?
Mislim da nije, jer su bar tri problema kod tog pristupa:
1. Moras da znas u designtime-u velicinu statickog vektora TCharArray, tako da njegova jedina primena bi bila da se koristi kao privremeni bafer fiksne velicine (npr 32k). Ne moze da bude rezultat funkcije koja npr. cita stream jer ima diskretnu duzinu.
2. Ne moze izbeci ni "izgradnja" stringa i ako bi ga koristio kao bafer, jer bi cepkao podatke na delove od 32k i onda opet ih sastavljao u izlazni string, sto sa sobom povlaci konstantno realociranje memorije, sto je i bio cilj izbeci.
3. Ne radi sa NULL karakterima, sto je osnovni cilj problema. Konverzija DestS := PArr^ ce iskopirati karaktere samo do prvog NULL-a jer Delphi vidi taj PCharArray kao PChar. Cak stavise, uposte nije potrebno imati taj PCharArray jer se zbog nasviranog kompajlera moze jednostavno napisati DestS := Arr bez indirektnog pristupa (mada to radi samo za staticke vektore, ne i za dinamicke tj. array of char).
Medjutim, ako se napise ovako:
Code:
var
S: String;
B: TBytes; //Virtuelni stream
Len: Integer;
begin
Len := 128;
SetLength(B, Len);
FillChar(B[0], Len, 'A');
SetLength(S, Len);
Move(B[0], S[1], Len);
S[3] := #0;
ShowMessage(S);
SetLength(S, 0);
SetLength(B, 0);
end;
Ovim se dobije:
1. Varijabilna velicina izlaznog stringa, odnosno Len moze da bude parametar funkcije.
2. NULL-ovi u stringu su sacuvani. To se u ShowMessage-u ne vidi jer se string S prosledi windows API wrapperu koji ga castuje u PChar, cist Delphi kod bi video i posle NULL karaktera.
[Ovu poruku je menjao Boris B. dana 31.03.2009. u 21:06 GMT+1]