关于动态数组和静态数组的问题(100分)

  • 主题发起人 主题发起人 amonw
  • 开始时间 开始时间
A

amonw

Unregistered / Unconfirmed
GUEST, unregistred user!
以下代码可以正常工作:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var buf:array[0..255] of char;
begin
socket.ReceiveBuf(buf,10);
showmessage(buf);
end;
而把buf改成动态数组则会发生访问冲突的错误,代码如下:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var buf:array of char;
begin
setlength(buf,256);
socket.ReceiveBuf(buf,10);
showmessage(pchar(buf));
end;
能告诉我为什么吗?
我怎样才能用动态数组完成类似功能呢?
 
你可以不用数组用pchar
 
setlength(buf,256);
256太大,必须是0到255之间的数
这是setlength的用法限制
 
TO sun77wind:
setlength(buf,256);256太大,必须是0到255之间的数
这是你说的?瞎说!!!!!
你自己去试试看!!!
 
TonyStar:
改成
var buf:pchar;
...
buf:=allocmem(200);
...
仍有同样错误

sun77wind:
改成setlength(buf,200),仍有同样错误
 
我记得以前在VB下用WINSOCKET编程序时,动态数组可以不用开辟空间的,也就是说SOCKET
会根据内存中的数据大小自动定义数组的大小,你这样试试看:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var buf:array of char;
begin
//setlength(buf,256);
socket.ReceiveBuf(buf,10);
showmessage(pchar(buf));
end;
 
to sun77wind:
D5好像没有这个限制。
 
To lujr:
不行。错误依旧。
 
你是不是其他什么地方有问题?
 
列出你的出错行及出错信息!
 
to tonystar:
以上已是我在server端所写的全部代码,
client端的全部代码只有:
procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.socket.SendText('123456789');
end;
奇怪的是用静态数组则没问题。
 
to lujr:
无出错行,是运行时产生一个EAccessViolation:Access violation at address 40004cb3 in module 'vcl50.bpl'.Read of address 34333231.
 
动态数组实际上是一个指针,所以你的代码是不对的。
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var buf:array of char;
begin
setlength(buf,256);
socket.ReceiveBuf(buf,10);
^^^^^^^^^^^^^^^^^^^^^^^^^
//估计应该改为 Socket.ReceiveBuf(buf^, 10);
showmessage(pchar(buf));
end;
 
楼上tseug说的有点道理
 
To tseug:
您说的非常正确,改成
Socket.ReceiveBuf(buf[0], 10);
后就好了。
那静态数组名就不是指针了吗?
有时候觉得delphi的一些概念反而没有c清晰明确
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部