关于TStream.ReadBuffer的Buffer参数(20分)

  • 主题发起人 主题发起人 至高之光
  • 开始时间 开始时间

至高之光

Unregistered / Unconfirmed
GUEST, unregistred user!
这是Delphi中的定义:
代码:
procedure WriteBuffer(var Buffer: Type
Count: Integer);

有些书籍上说Buffer要用到指针类型。
代码:
FileStream1.WriteBuffer(PInteger(Integer1)^, 4)
其中的PInteger已经将其转换为指针,后面加一个^不就把指针解除了。它的效果与Integer1有什么区别呢?
 
哪本书上说的“Buffer是指针类型”呀?那个作者该抓去打屁股了[:D]
var Buffer:Type;意思是说Buffer可以是任意类型,相当于C/C++中的void类型。
也就是说可以把任意一个变量代入这个参数中,只要第二个参数Count的值正确地指定为Buffer的数据存储长度(以字节为单位)即可。
比如FileStream.WriteBuffer(PInteger(Integer)^, 2)这句就是错误的,因为PInteger(Integer)^的结果是一个Integer的值,数据存储长度是4个字节。所以正确的写法应该是FileStream.WriteBuffer(PInteger(Integer)^, 4)
 
procedure WriteBuffer(var Buffer: Type
[red]Count: Integer[/red]);
楼上认为2是错误。只能是4。好象也不对吧。
 
楼上是在开玩笑吧,是就是,不是就不是,没有什么“好象”的。VCL流对象的ReadBuffer和WriteBuffer两个方法对Count参数的要求可是很严格的,稍有不对就马上会抛出异常。
Integer数据类型的存储长度当然是4个字节(32位)的,这可是基本常识。如果还不明白,可以看看Delphi帮助里面的“Integer types”一节,那里面有一段话写得很清楚--
Generic integer types for 32-bit implementations of Delphi
Type Range Format
Integer -2147483648..2147483647 signed 32-bit
Cardinal 0..4294967295 unsigned 32-bit
 
  真不好意思,感谢楼上各位的回答。我把人家的意思理解错了。他的意思是说需要用指针,不是说这个就是指针。
  至于那个2,我本来用的是ShortInt,自然是1,后来考虑到PShortInt要定义,我懒得放上来了,就把它改了,改的时候没有注意。我马上改过来。
  不过,那个buffer类型到底是什么一个类型呢?
 
韦剑兄,你说那个void类型我不太明白。至于任意一个类行动可以用,为什么我这里如果直接写一个Integer1进去的话,会出现E2036 Variable Required错误呢?
 
楼主请注意我说的话“也就是说可以把任意一个变量代入这个参数中”,注意我说的是“变量”,你把常数代进去当然不对了。
 
不好意思,我把函数返回值认为是变量了。说起来,只有在var、const等专门定义的标识符以及指针指向,才看作是变量吗?
 
const定义的是常量,函数返回值也是常量。
var定义的才是变量。
 
接受答案了.
 
后退
顶部