On Wed, October 19, 2011 09:13, Felipe Monteiro de Carvalho wrote:
Hi, > Usually when we work with PChars we do things like this to set the > final terminator: > > var > ansistr: ansistring; > begin > // Copy the originating string taking into account the specified length > SetLength(ansistr, len+1); > System.Move(source^, ansistr[1], len); > ansistr[len+1] := #0; > SetLength(ansistr, len); > > And it works fine. You get a string with correct length and a final #0 > terminator. > > Now, I simply tryed the same code for a unicodestring, and it corrupts my > stack: > > procedure Unicode2AnsiMove(source:pwidechar;var > dest:ansistring;len:SizeInt); > var > widestr: unicodestring; > begin > {$ifdef PASWSTRING_VERBOSE}WriteLn('Unicode2AnsiMove START');{$endif} > // Copy the originating string taking into account the specified length > SetLength(widestr, len+1); > System.Move(source^, widestr[1], len*2); > PWideChar(@widestr)[len] := #0; // <--- This corrupts the stack > SetLength(widestr, len); > > I already fixed the problem by simply not setting this last widechar > to #0, but now I got puzzled: Any ideas why this doesn't work? > > It crashes only a bit after this procedure, but I found that this was > the statement which caused the problem. Sorry for a silly question, but why the difference between the two implementations (i.e. why not addressing the WideStr element directly without the typecast)? Moreover, even if using the PWideChar, I believe that the correct version would be without the '@' (i.e.: PWideChar(widestr)[len] := #0), wouldn't it? Tomas _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal