有关PChar和String的神奇问题!!我蒙了!(10分)

  • 主题发起人 主题发起人 backup
  • 开始时间 开始时间
B

backup

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(] 大侠看看这个程序的问题!
procedure TForm1.FormClick(Sender: TObject);

var
aa,bb:string;

begin
SetLength(aa,1);
SetLength(bb,1);
aa[1]:='z';
bb:=aa;
showmessage('bb is '+strUpper(Pchar(bb))+
' aa is '+aa);
// question occured, 我想的是'bb is Z aa is z'
// 但是实际上输出的是 'bb is Z aa iss Z',我蒙了,这delphi是不是变态了![:(]
// 这问题如何解决?? 请有兴趣的大侠用你的delphi编译一下试试!改如何解决呢?
end;
 
我这儿好好的!提醒你一下,在这个地方别说“delphi是不是变态了”:)
 
再说,UpperCase(aa)就行,不用那么麻烦的。
 
showmessage('bb is '+uppercase(Pchar(bb))+
' aa is '+aa);
 
to zw84611:
您那儿好好的?!really?
您如果试了,那就是我的delphi5的问题了,:( (或许是我的WinME的问题?? )
提醒我一下,在这个地方不说“delphi是不是变态了”:)
哪位大侠还试了?[h3][red]ugvanxk [/red][/h3]您试了吗?我原来的代码
showmessage('bb is '+strUpper(Pchar(bb))+ ' aa is '+aa);
输出的是什么?
哪位大侠再帮着试试,我这就一台机器!谢了:)





 
我的Windows2000 + D5
显示:bb is Z aa is Z
正常
 
你把strUpper换成UpperCase
 
var
aa,bb:string;
begin
SetLength(aa,1);
SetLength(bb,1);
aa[1]:='z';
[red]bb:=copy(aa,1, sizeof(aa));[/red]
showmessage('bb is '+strUpper(Pchar(bb))+
' aa is '+aa);
[blue]
其实问题在线SetLength时aa,bb是长度已经确定的数组了,数组间赋值只是
将它的指针指向同一个内存地址,所以会有你上面的问题,用COPY函数就可以改决
。以上是我大概记得的,有什么不对的,望指出更正。谢谢。 [/blue]
 
我的机器:windows 2000 advanced server+D5
一切都是那么的正常.
 
给你解释一下,
在DELPHI中,为减少字串的内存使用,使用同串的变量只使用同一个内存,
只不过是有另外一个标识说明这个字串有谁谁谁在使用。
也就是说将AA给BB时,BB实际上使用的内存单元和AA是同一个。
AA和BB均是指针指向一个内存单元。
STRUPPER是将这个指针指向的字串全部转成大写。
这点跟UPPERCASE不同,UPPERCASE是先复制一份,再将复制的转为大写,返回给调用者。
 
3h应该得到全部的分数,他的回答是正确的。
Delphi对String的处理是:
-8:Word Length
-4: Word References Count
 
3h的回答完全正确。
 
同意 3h,
关键是 strUpper ->>
StrUpper converts Str to uppercase and returns Str.( 看帮助)
 
同意3h的说法
而且我win98se+D6测试结果也证实了这点
 
要Copy()才能把bb和aa分开的!!
 
上了一课!Thanx!
 
我.... 我.....,!_! 我好感动呀,这么多大侠帮我, :()
这个分不好给呀(给的太少了,哈哈),我分配分了(只有10分,大家不要说我小气可以哦[:D]),
[red]3h 5分 [/red],因为着才是我真正需要了解的东东啦!(因为我猜想string类型的东东实际上
是一个内存地址指针,果真如此!但我没想到delphi的优化了,(我把那个优化选项关了也不行!
))
zw84611 5分, 迅速解决问题,并且告诉我这是什么地方:))
其它仁兄,小弟对不住了,请见谅!






 
bb:=copy(aa,0,length(aa))
[:D]
 
好不容易找了一条容易答的,不过只有5分:)
哈哈哈,无所谓了,有分就好:)
 
后退
顶部