私は自分のカスタムBattleshipゲーム用のマッチメーキングサーバーを作っています。私はネットワークコーディングの初心者ですので、あくまで疑問に思って申し訳ありません。 :PDelphi 10. TCustomWinSocketの配列使用上のアクセス違反
今すぐトピックに近い。私はデフォルトのDelphi Server/Clientソケットコンポーネントを使用します。私はパブリックセクション(clients: array of TCustomWinSocket;
)で宣言された配列を持っています。メインフレームの起動時に、長さを0に設定します(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;
は基本的に、私はこの配列を使用するたびに、それは、アクセス違反を与える
はここで例外をスローするコード例です。私はそれを得ることができません、私は配列の長さにとどまるようにコードを制限しますが、そうではありません。それともそれはいつものように私の愚かさですか?
いずれにしても、私は本当に助けをすることができます。
ありがとうございます! :)
こんにちは、@KenWhite !ご回答ありがとうございます!それが問題ではなく、0要素が存在する前にプログラムをテストしていたときに、アクセス違反を起こした後、私は過去にそれを使用していたので、0のインデックスをもう一度使用しないようにしていませんでした。再び働く。私はとても混乱しています...しかし、もう一度助けてくれてありがとう! –
下記の私の答えを見てください。投稿したコードにも他の問題があります。 –