Was trying to write simple client and server recieveing/sending data through TMemoryStream
. When I push button in client btnTestClick
it apperas an error
Access violation at address 005D5581 in module 'Client.exe'. Write of adress 00000000
. What I do wrong?
Btw client server connection works okay I thin cuz IdTCPClient1Connected
function is writing 'Client Connected!'
.
Client code
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
Server code
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;
You start writing into a dynamic array before you've allocated any elements for it. Dynamic arrays do not automatically grow like you might be used to from some other languages. You need to set their lengths first.
If you haven't set the length of a dynamic array, then it will just be a null pointer, which explains why you get an access violation at address 0.
Change your btnTestClick method like so:
var
msRecInfo: TMemoryStream;
arrOf: array of Integer;
i: integer;
begin
SetLength(arrOf, 11);
for i := 0 to 10 do
arrOf[i] := Random(100);