[Lazarus] Can't compile trunk with fpc 2.4.5 under ubuntu
Sven Barth
pascaldragon at googlemail.com
Tue Feb 28 16:52:10 CET 2012
Am 28.02.2012 15:31, schrieb Martin Schreiber:
> Am 28.02.2012 16:13, schrieb Sven Barth:
>> Am 28.02.2012 15:40, schrieb Hans-Peter Diettrich:
>>> Sven Barth schrieb:
>>>
>>>> Before Delphi 2009 you might have been right, but with that version
>>>> Embarcadero did a cut and we now need to adapt and live with that.
>>>
>>> I dare to disagree. A "ByteString" only requires a dedicated encoding
>>> (value), which makes it incompatible with other encodings, and thus
>>> disables all conversions. Such an encoding doesn't break Delphi
>>> compatibility, but allows to use all stringhandling functions with it.
>>
>> And instead of introducing yet another type or another special encoding
>> we could just leverage the features FPC has today and use TBytes.
>>
> Or even better, use FPC 2.6 AnsiString and UnicodeString and drop the
> encoding aware FPC 2.7 AnsiString. ;-)
>
> BTW, please have a look into the different string concatenation
> compilerproc, it is probably not so easy to model that with equal or
> better performance with TBytes and operator overloading. Is it possible
> with operator overloading to combine different types?
Did you look at the 2.7.1 or 2.6.0 implementation of these procs? If the
2.6.0 one then I suggest you to look at the 2.7.1 ones and reconsider
your statement ;)
Nevertheless I'll try to do a speed measurement with TBytes and
AnsiString both in 2.6 and 2.7.1. If we can improve the performance of
FillChar (which would also benefit class creation btw) then this might
be a rather performant alternative ;)
> "
> <TBytes>:= <TBytes> + 'stringconstant' + <TBytes> + <AnsiString>;
> "
I quickly adjusted my test program:
=== source begin ===
program bytearraytest;
{$mode objfpc}
type
TBytes = array of Byte;
operator + (aLeft, aRight: TBytes): TBytes;
begin
SetLength(Result, Length(aLeft) + Length(aRight));
if Length(aLeft) > 0 then
Move(aLeft[0], Result[0], Length(aLeft) * SizeOf(Byte));
if Length(aRight) > 0 then
Move(aRight[0], Result[Length(aLeft)], Length(aRight) * SizeOf(Byte));
end;
operator + (aLeft: TBytes; aRight: AnsiString): TBytes;
begin
SetLength(Result, Length(aLeft) + Length(aRight));
if Length(aLeft) > 0 then
Move(aLeft[0], Result[0], Length(aLeft) * SizeOf(Byte));
if Length(aRight) > 0 then
Move(aRight[1], Result[Length(aLeft)], Length(aRight) * SizeOf(Char));
end;
operator + (aLeft: AnsiString; aRight: TBytes): TBytes;
begin
SetLength(Result, Length(aLeft) + Length(aRight));
if Length(aLeft) > 0 then
Move(aLeft[1], Result[0], Length(aLeft) * SizeOf(Char));
if Length(aRight) > 0 then
Move(aRight[0], Result[Length(aLeft)], Length(aRight) * SizeOf(Byte));
end;
var
arr1, arr2, arr3: TBytes;
b: Byte;
i: LongInt;
s: AnsiString;
begin
SetLength(arr1, 5);
for i := 0 to 4 do
arr1[i] := i + 1;
SetLength(arr2, 5);
for i := 0 to 4 do
arr2[i] := i + 6;
arr3 := arr1 + arr2;
for b in arr3 do
Write(b, ' ');
Writeln;
arr3 := Copy(arr2, 2, 2);
for b in arr3 do
Write(b, ' ');
Writeln;
s := 'Hello World';
arr3 := arr1 + 'stringconstant' + arr2 + s;
for b in arr3 do
Write(b, ' ');
Writeln;
end.
=== source end ===
And here is what it prints:
=== source begin ===
PS P:\tests\oneshots> .\bytearraytest.exe
1 2 3 4 5 6 7 8 9 10
8 9
1 2 3 4 5 115 116 114 105 110 103 99 111 110 115 116 97 110 116 6 7 8 9
10 72 101 108 108 111 32 87 111 114 108 100
=== source end ===
Regards,
Sven
More information about the Lazarus
mailing list