delphi 引用的问题,怎么和C指针不一样吗,表示不解

codejava 2012-09-17 10:52:36
//数据定义
type
DataPack = record
DataPackFlag: LongInt;
DataPackCurrLength: LongInt;
DataPackInfo: array[1..1000] of Char;
end;
//注意此处的定义,实现的var 引用。。。。。。。。。。。。。。。
function SendPacket(ServerSock: Tsocket; var pBuffer: PChar; iDatalength: Integer): Integer; stdcall;
var
tmp_iSendBytes: Integer;
tmp_iTotalBytes: Integer;
Buf:DataPack;
begin
tmp_iSendBytes := 0;
tmp_iTotalBytes := 0;
//Move(pbuffer^,Buf,iDatalength); //此处如果不写成pBuffer^拷贝到的内容竟然还是指针偏移了四个字节。。特别郁闷 ???????? 测试使用
if ServerSock = SOCKET_ERROR then //高人指点迷津啊??????????????、、
begin
CommonSendPacket := 0;
Exit;
end
else
begin
while (tmp_iSendBytes < iDatalength) do
begin
//调试发现为什么,使用了引用。但是传递过来的pBuffer指针指向的不是首地址呢、
//发现地址提前了四个字节即就是pBuffer+4=下面的@m_DataPackSend地址 ????
tmp_iSendBytes := send(ServerSock, pBuffer, iDatalength - tmp_iTotalBytes, 0);
if tmp_iSendBytes > 0 then
begin
pBuffer := pBuffer + tmp_iTotalBytes;
tmp_iTotalBytes := tmp_iTotalBytes + tmp_iSendBytes;
end
else
begin
SendPacket := tmp_iTotalBytes;
Exit;
end
end;
SendPacket:= tmp_iTotalBytes;
end
end;

var
m_DataPackSend:DataPack;
m_pDataBuffer:PChar;
//********** 调用发送函数
FillDataPack;//填充数据包结构
m_pDataBuffer:=@m_DataPackSend;//取其存储地址
tmp_iBytesCounts:=SendPacket(m_hServerSocket,m_pDataBuffer,m_DataPackSend.DataPackCurrLength);



我要实现条用函数传递指针地址,被调用函数实现操作。这样写不对吗??

大家有什么办法,西望不吝赐教。
...全文
139 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
5t4rk 2012-09-18
  • 打赏
  • 举报
回复
楼主的想法,时实现指针传递。。

其实指针本省就是引用。。

指针地址必须是唯一的。所以你的var显然就成了多余的。

begin
//调试发现为什么,使用了引用。但是传递过来的pBuffer指针指向的不是首地址呢、
//发现地址提前了四个字节即就是pBuffer+4=下面的@m_DataPackSend地址 ????
tmp_iSendBytes := send(ServerSock, pBuffer, iDatalength - tmp_iTotalBytes, 0);
//改为 send(ServerSock, pBuffer^, iDatalength - tmp_iTotalBytes, 0);
function SendPacket(ServerSock: Tsocket; var pBuffer: PChar; iDatalength: Integer): Integer; stdcall;//去掉var



//注意此处的send函数,参数类型为untyped的。。

所谓无类型参数可以接收任何类型的值,只是从语法角度而言的。或者说,理论上我们可以实现一个可以使用任何类型变量作为参数的过程,但是实际上没有必要,也不可能做到。

打个比方说,我们想造一辆可以装载任何物体的汽车。因为是“任何物体”,所以物体可能是任何形状,于是这辆车必须没有车篷,除了在几个车轮上铺一个足够大(足够大就已经是个大问题了)的平板外,不能再有任何东西。这时候,这个平板就可以看做是无类型的,因为它上面可以坐人、摆一张桌子,也可以赶一些动物上去站着或者躺着。尽管它可以承载很多种类的东西,但是也是有限制的,比如不能放一座山。

所以无类型参数的类型往往是有一定限制的。比如SetLength的参数S只能是字符串、动态数组等。

这种限制一般是在过程的实现中完成的,在运行时检查参数值的实际类型。对于与开发环境关系紧密的参数,限制也可以构筑在编译器里。

使用无类型参数的原因是无法在声明时使用一个统一的类型来描述运行时可能的类型,如SetLength的参数S可以是字符串和动态数组,而并没有一个统一的类型来代表字符串和动态数组类型,所以干脆声明为无类型。而将类型限制放到别的地方实现(如编译器)。例如SetLength的限制规则是写在编译器中的,它只能作用于长字符串或者动态数组
bdmh 2012-09-18
  • 打赏
  • 举报
回复
var传递就是引用传递,Pchar就是指针,对指针 var ,是指针的指针
Oraclers 2012-09-18
  • 打赏
  • 举报
回复
PChar本身就是指针类型咯,pBuffer当然是一个地址。
codejava 2012-09-18
  • 打赏
  • 举报
回复
问题解决了,谢谢大家。。
pathletboy 2012-09-18
  • 打赏
  • 举报
回复
对于这种问题,我一般采用我怎么传入参数,然后函数内部比如这个move加上@是否能访问到我需要拷贝的数据,这么逆向想一下,就不容易出错。
ok1411 2012-09-18
  • 打赏
  • 举报
回复
delphi的 参数var表示可修改的变量(入参起作用,出参有效),out就是出参(入参无效,出参有效)
参数类型同变量类型
传了 var pBuffer: PChar; pBuffer可以赋值后传进去,也可以传空,在函数里面赋值当作返回值

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧