不明白ObjectPascal,奇怪?(50分)

  • 主题发起人 主题发起人 jerryT
  • 开始时间 开始时间
J

jerryT

Unregistered / Unconfirmed
GUEST, unregistred user!
1、问:我不明白既然ansistring是以null结束的字符串,为何转成pchar类型(也以null结束)后还需再恢复为null结束的长度?
2、问:哪位高手能以实例讲解一下可变的记录类型?
 
pchar是以#0结尾的字符串,和pascal管理方式不一样,比如string的string[0]是string的
长度,而pchar就不是
 
也许我说的不够清楚,在此重新申明
1、问:我不明白既然ansistring是以null结束的字符串,为何转成pchar类型(也以null结束)后还需手工再恢复为null结束的长度?
{当然它们在内存分布上是不同的}
2、问:哪位高手能以实例讲解一下可变的记录类型实用性?
 
ansistring有引用记数的,PCHAR没有,为了DELPHI的内存管理手工再恢复为null结束
的长度
 
因为DELPHI意识不到内存已改变
 
2. 我认为课变纪录类型主要是为了编译器能更好进行类型检查而存在的,另一方面是为了提高程序可读性
TRect = record
case Integer of
0: (Left, Top, Right, Bottom: Integer);
1: (TopLeft, BottomRight: TPoint);
end;

TNoUseRec = record
case integer of
0: (DateTime: TDateTime);
1: (Int1, Int2: Integer);
2: (FloatValue: Double);
3: (char1, char2: Char
RealValue: Real48);
end;

 
to 张无忌:
ansistring 字符串的序号是从1开始的,因为长字符串没有序号为0的字符.要获取长字符串的实际长度,
只能调用Length().

编译器会自动在ansistring 字符串的最后一个字符后面添加一个null字符(#0), 表示字符串
的结束, 但是, 该null字符本身并不是ansistring字符串的一部分.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

当用Pchar强制把ansistring字符串转换为Pchar类型后, 得到一个指针, 指向ansistring字符串
的第一个字符, 如果原来ansistring是空的,就指向了那个null了. 现在这个null已经成为
ansistring字符串的一部分了(我个人的理解).

当PChar类型使用完毕后, 需要把那个已经成为ansistring字符串一部分的null 重新排除在ansistring
字符串之外(当然,在内存中是存在的,只是不计入ansistring字符串而已) ,这时,就需要用
STRUTILS 单元中的RealizeLength() 函数来恢复.
如设:
S : string;

Setlength(S,256);
GetWindowsDirectory(PChar(S), 256);
RealizeLength(S)
//恢复ansistring字符串S的长度.



 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
825
DelphiTeacher的专栏
D
后退
顶部