-2

を介してデータを送受信する単純なクライアントおよびサーバーを書き込もうとしていましTMemoryStreamた。クライアントのボタンを押すとbtnTestClick、エラーが表示 されますAccess violation at address 005D5581 in module 'Client.exe'. Write of adress 00000000。私は何を間違えますか?

ところで、クライアントサーバー接続は問題なく動作します。thincuzIdTCPClient1Connected関数が書き込みを行ってい'Client Connected!'ます。

クライアントコード

procedure TForm1.btnTestClick(Sender: TObject);
var
  msRecInfo: TMemoryStream;
  arrOf: array of Integer; i:integer;
begin
  for i := 0 to 10 do
    arrOf[i]:=random(100);

  msRecInfo:= TMemoryStream.Create;

  try
    msRecInfo.Write(arrOf, SizeOf(arrOf));
    idTCPClient1.IOHandler.Write(msRecInfo);
  finally
     msRecInfo.Free;
  end;

end;

end

サーバーコード

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
   msRecInfo: TMemoryStream;
  arrOf: array of Integer; i:integer;
begin
  msRecInfo:= TMemoryStream.Create;
  try
    AContext.Connection.IOHandler.ReadStream(msRecInfo, -1, False);

    msRecInfo.Position := 0;
    msRecInfo.Read(arrof, SizeOf(arrof));
  finally
    memo1.Lines.Add(IntToStr(arrOf[1]));
    msRecInfo.Free;
  end;
  //AContext.Connection.IOHandler.ReadStream(msRecInfo, SizeOf(arrOf));
  //msRecInfo.Read(arrOf, sizeOf(arrOf));
end;
4

1 に答える 1

5

要素を割り当てる前に、動的配列への書き込みを開始します。動的配列は、他の言語に慣れているように自動的に大きくなることはありません。最初に長さを設定する必要があります。

動的配列の長さを設定していない場合は、nullポインターになります。これは、アドレス0でアクセス違反が発生する理由を説明しています。

btnTestClickメソッドを次のように変更します。

var
  msRecInfo: TMemoryStream;
  arrOf: array of Integer;
  i: integer;
begin
  SetLength(arrOf, 11);
  for i := 0 to 10 do
    arrOf[i] := Random(100);
于 2012-11-21T19:50:04.343 に答える