[fpc-devel] Found two Delphi incompatibilities

Michael Van Canneyt michael at freepascal.org
Thu Aug 31 12:12:50 CEST 2006



On Thu, 31 Aug 2006, Sergei Gorelkin wrote:

> Thursday, August 31, 2006, 12:35:33 PM, Michael wrote:
>
>
> MVC> On Thu, 31 Aug 2006, Sergei Gorelkin wrote:
>
>>> Hello,
>>>
>>> While porting some Delphi code, I found the following two
>>> incomatibility issues. Should I report them as bugs?
>>>
>>> Sample 1: It compiles both in Delphi and FPC, but FPC executable fails
>>> at runtime. Delphi inserts temporary string variable and conversion
>>> (array of char -> string), but FPC treats the pointer literally.
>
> MVC> Did you check the '@ returns typed pointer' setting in FPC ?
>
> Oops... That was a false alarm - FPC compiler behaves the same way as
> Delphi here. They both generate conversion code in {$T+} and do not
> generate it in {$T-}.
> So my sample appears to be legal only in {$T+}, which isn't a default.
>
> What makes a difference is actually TStrings.SetTextStr implementation.
> Delphi accesses the argument as null-terminated string, so it works perfectly
> well even without conversion. FPC implementation treats argument as
> AnsiString, accesses its Length field and eventually segfaults...

We should check that.

>
>>> -----
>>> const
>>>  TestData: array[0..7] of Char = 'abc'#10'def'#0;
>>>
>>> procedure Test1;
>>> var
>>>  sl: TStringList;
>>> begin
>>>  sl := TStringList.Create;
>>>  sl.Text := string(@TestData[0]);  // <- fails here
>>>  sl.Free;
>>> end;
>>> -----
>>>
>>> Sample 2: This one compiles with Delphi (again, it inserts necessary
>>> conversion Wide -> Ansi), but does not compile with FPC, neither in
>>> objfpc nor in Delphi mode.
>>>
>>> -----
>>> function Test2: string;
>>> var
>>>  buf: array[0..255] of char;
>>>  len: Integer;
>>> begin
>>> { (skipped) I read USB string descriptor into buf. After that,
>>>  buf[0] contains length of descriptor in bytes, buf[1] = 3,
>>>  and rest is filled with Unicode chars. Now I want to convert it into
>>>  ASCII...
>>> }
>>>  len := Integer(buf[0]) shr 1;
>>>  SetString(result, PWideChar(@buf[2]), len-1);
>>> end;
>
> MVC> What is the error ?
>
> It is 'Incompatible type for arg no.2: Got "PWideChar", expected
> "PChar"'.

Seems like a missing overloaded version of SetString()

Michael.



More information about the fpc-devel mailing list