2012-11-21 2 views
-2

TMemoryStream을 통해 간단한 클라이언트 및 서버 수신/전송 데이터를 쓰려고했습니다. 클라이언트의 버튼을 누를 때 btnTestClick 오류가 발생합니다. Access violation at address 005D5581 in module 'Client.exe'. Write of adress 00000000. 내가 뭘 잘못 했니?델파이의 서버에 대한 액세스 위반

Btw 클라이언트 서버 연결이 정상적으로 작동합니다. 얇은 사다리꼴 IdTCPClient1Connected 기능이 '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; 
+2

처음에는 arrOf 길이를 설정하지 않고 SizeOf (arrOf)를 수정해야합니다. –

+1

왜 많은 관련성이없는 코드를 포함 시켰습니까? 당신은 이미 문제가 서버와 관련이 없다는 것을 알고 있었습니까? 문제가 btnTestClick 메소드에만 국한되어 있다는 것을 알았으므로 여기에 모두 포함시켜야합니다. –

+0

@RobKennedy 죄송합니다, 방금 Ctrl + C를 사용했습니다. – DanilGholtsman

답변

5

당신은 당신이 그것을 위해 어떤 요소를 할당 한 전에 동적 배열로 쓰기 시작. 동적 배열은 다른 언어에서 익숙해 진 것처럼 자동으로 확장되지 않습니다. 먼저 길이를 설정해야합니다. 동적 배열의 길이를 설정하지 않은 경우

, 그것은 당신이 주소 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); 
+0

이 배열을 처분 할 때이 메모리를 해제하려면'SetLength (MyArray, 0); '도 추가해야합니다. 네가하지 않으면 나는 이상한 행동을 보았다. –