|
[완성 소스]--------------------------------------
// CR 이나 LF는 그냥 써도 됩니다...정의되어 있으니 따로 정의할 필요는 없습니다.
// 그래서 생략했슴.
int Start, Stop;
if(Memo1->Lines->Count==0) Memo1->Lines->Add("");
Start = 1;
Stop = Buffer.Pos(CR);
if(Stop == 0) Stop = Buffer.Length() + 1;
while(Start <= Buffer.Length())
{
Memo1->Lines->Strings[Memo1->Lines->Count -1] =
Memo1->Lines->Strings[Memo1->Lines->Count -1] + Buffer.SubString(Start, Stop-Start);
// 님이 보신 에러는 배열에서 나온 에러입니다.
// 예)
// 배열 Buffer의 길이가 10 이라면
// 처음은 Buffer[0] 이고
// 마지막은 Buffer[9] 입니다.
// Buffer[10]을 읽으러고 하면 에러가 나지요.
// 사용시 보통 n-1 형태로 합니다.
// Start 나 Stop을 그냥 배열의 요소를 지정하는데
// 사용해서 나온 에러입니다.
// 따라서 Buffer[Strat-1], Buffer[Stop-1] 이렇게 해야
// 에러가 안납니다.
if(Buffer[Stop-1] == CR)
{
Memo1->Lines->Add("");
SendMessage(Memo1->Handle, WM_KEYDOWN, VK_UP,1);
}
Start = Stop +1;
if(Start > Buffer.Length()) break;
if(Buffer[Start-1] == LF) Start = Start +1;
// 이부분 파스칼 소스를 보니 if문 밖에 있네요.
// 님은 if문 안에 포함을 시켰구요.
Stop = Start;
while((Buffer[Stop-1] != CR) && Stop <= Buffer.Length())
Stop = Stop +1;
}
---------------------------------------------
짧은 생각으로 대충 설명을 달았는데....도움이 되었나요?
통일바라기 님이 쓰신 글 :
: 인디를 이용한 Telnet 데모 프로그램을 C++로 변환하려고 합니다.
: 그런데, 초보실력으로는 도무지 모르겠습니다.
:
: 파스칼 문법을 찾아가며 변환시킨다고 했는데도 뭔가 빠진것 같아서,
: 고수님들의 도움을 요청하고자 합니다.
:
: 실행하고서, 서버 연결을 요청하면 에러가 나고
:
: char& __fastcall operator [](const int idx)
: {
: * ThrowIfOutOfRange(idx); // Should Range-checking be optional to avoid overhead ??
: Unique(); // Ensure we're not ref-counted
: return Data[idx-1];
: }
: 위의 * 표시된 부분에서 에러가 난다고 나옵니다.
:
: 추정하건대, Buffer 데이터를 Memo1에 뿌려주면서 에러가 발생한듯 싶기는 합니다....
:
:
:
: < 델파이 소스>
:
: procedure TfrmTelnetDemo.IdTelnetDemoDataAvailable(Buffer: String);
:
: const
: CR = #13;
: LF = #10;
: var
: Start, Stop : Integer;
:
: begin
: if Memo1.Lines.Count = 0 then
: Memo1.Lines.Add('');
:
: Start := 1;
: Stop := Pos(CR, Buffer);
: if Stop = 0 then
: Stop := Length(Buffer) + 1;
: while Start <= Length(Buffer) do begin
: Memo1.Lines.Strings[Memo1.Lines.Count - 1] :=
: Memo1.Lines.Strings[Memo1.Lines.Count - 1] +
: Copy(Buffer, Start, Stop - Start);
: if Buffer[Stop] = CR then begin
: Memo1.Lines.Add('');
: SendMessage(Memo1.Handle, WM_KEYDOWN, VK_UP, 1);
: end;
: Start := Stop + 1;
: if Start > Length(Buffer) then
: Break;
: if Buffer[Start] = LF then
: Start := Start + 1;
: Stop := Start;
: while (Buffer[Stop] <> CR) and (Stop <= Length(Buffer)) do
: Stop := Stop + 1;
: end;
: end;
:
:
: <C++ 빌더로 변환시켜본 소스>
: void __fastcall TForm1::IdTelnet1DataAvailable(AnsiString Buffer)
: {
: const CR = 13;
: const LF = 10;
: int Start, Stop;
:
: if(Memo1->Lines->Count==0)
: Memo1->Lines->Add("");
: Start = 1;
: Stop = Buffer.Pos(CR);
: if (Stop == 0)
: Stop = Buffer.Length() + 1;
:
: while (Start <= Buffer.Length()) {
: Memo1->Lines->Strings[Memo1->Lines->Count -1] =
: Memo1->Lines->Strings[Memo1->Lines->Count -1] + Buffer.SubString(Start, Stop-Start);
:
: if (Buffer[Stop] == CR) {
: Memo1->Lines->Add("");
: SendMessage(Memo1->Handle, WM_KEYDOWN, VK_UP,1);
: // 이함수는 뭔지 모르겠는데, 추정해보면 Memo1으로 제어권을 넘긴다는 말인지...
: }
:
: Start = Stop +1;
: if (Start > Buffer.Length())
: break;
:
: if (Buffer[Start] == LF) {
: Start = Start +1;
: Stop = Start;
: }
: while ((Buffer[Stop] != CR) && Stop <= Buffer.Length())
: Stop = Stop +1;
: }
: }
:
:
|