Re[2]: [fpc-devel] Found two Delphi incompatibilities
Op Thu, 31 Aug 2006, schreef Sergei Gorelkin: > 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... I think FPC's implementation is correct, because, as I read the documentation, it isn't specified that the string cannot contain #0. So, you need to use the actual length of the string. Daniël___ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-devel
Re[2]: [fpc-devel] Found two Delphi incompatibilities
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. ___ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-devel
Re[2]: [fpc-devel] Found two Delphi incompatibilities
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... >> - >> 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"'. MVC> Michael. MVC> ___ MVC> fpc-devel maillist - fpc-devel@lists.freepascal.org MVC> http://lists.freepascal.org/mailman/listinfo/fpc-devel -- Best regards, Sergeimailto:[EMAIL PROTECTED] ___ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-devel