gpt4 book ai didi

arrays - Delphi 10. TCustomWinSocket 数组使用时访问冲突

转载 作者:行者123 更新时间:2023-12-03 04:49:36 33 4
gpt4 key购买 nike

我正在为我的自定义战舰游戏制作一个匹配服务器。我是网络编码的初学者,所以对于愚蠢的问题我提前表示歉意。 :P

现在更接近主题了。我使用默认的 Delphi 服务器/客户端套接字组件。我在公共(public)部分( clients: array of TCustomWinSocket; )中声明了我的数组,然后在主机启动时将长度设置为零( setLength(clients, 0); )。现在对我来说令人困惑的部分是:每当我尝试访问数组程序的任何元素时,都会引发访问冲突异常。我已经以任何已知的方式检查过,程序永远不会超过数组的长度。

这里是抛出异常的代码示例:

procedure Tmain.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to length(clients) do begin
if assigned(clients[i]) then begin
showmessage(IntToStr(i));
showmessage(IntToStr(i) + ': ' + clients[i].RemoteAddress);
end;
end;
end;

另一个例子:

procedure Tmain.serverClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
addLog('(' + Socket.RemoteAddress + ':' + IntToStr(Socket.RemotePort) + ') Клиент подключился');
if length(clients) <> 0 then begin
showmessage(IntToStr(length(clients)));
setLength(clients, length(clients) + 1);
showmessage(IntToStr(length(clients)));
clients[length(clients)] := Socket;
end
else if length(clients) = 0 then begin
showmessage(IntToStr(length(clients)));
clients[0] := Socket;
end;

end;

基本上,每次我使用这个数组时都会出现访问冲突。我无法得到它,我限制代码保留在数组长度中,但它没有。或者,也许,像往常一样,这是我的愚蠢造成的?

无论如何,我真的需要一些帮助。

提前致谢! :)

最佳答案

在此循环中,您正在运行到数组末尾。 Length(clients) 比最后一个索引高 1,因为动态数组的索引从零开始。您必须使用 Length(clients) - 1High(clients) 作为循环的终止符。

procedure Tmain.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to High(clients) do begin // or Length(clients) - 1
if assigned(clients[i]) then begin
showmessage(IntToStr(i));
showmessage(IntToStr(i) + ': ' + clients[i].RemoteAddress);
end;
end;
end;

您的第二个代码块中也有类似的错误,另外还有一个非常清楚的错误:

procedure Tmain.serverClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
addLog('(' + Socket.RemoteAddress + ':' + IntToStr(Socket.RemotePort) + ') Клиент подключился');
if length(clients) <> 0 then begin
showmessage(IntToStr(length(clients))); // Need - 1 or High() here
setLength(clients, length(clients) + 1);
showmessage(IntToStr(length(clients))); // Need - 1 or High() here
clients[length(clients)] := Socket;
end
else if length(clients) = 0 then begin // Second problem starts here
showmessage(IntToStr(length(clients))); // See text below
clients[0] := Socket;
end;
end;

第二个错误是在 Length(clients) = 0 时尝试分配给 clients[0],因为这是无效索引。如果数组长度为零,则不存在元素 0,因为数组为空——其中没有元素——没有一个元素;您无法将值分配给其中包含零个元素的数组。

整个 block 的正确代码如下 - 您不需要两个测试来测试长度 = 0,或跳过所有的障碍:

procedure Tmain.ServerClientConnect(Sender: TObject; Socket; TCustomSocket);
begin
AddLog('Whatever you want to log.');
SetLength(clients, Length(clients) + 1);
Clients[High(Clients)] := Socket;
end;

关于arrays - Delphi 10. TCustomWinSocket 数组使用时访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39309099/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com