Q&A

  • 버퍼에 저장하기[소스포함]
안녕하세여..헤임달입니다..

text로입력받은 6개의 데이터를 버퍼에 저장할려고합니다..

여기서 4개는 한번 입력하면 20번째까지 똑같고 두가지만 1에서 20까지, A,B,C 이렇게 변하게됩니다..

그래서 한번 입력했을때 그 데이터들을 버퍼에 저장하는데여..

확인해보니까 이상한값들이 찍힙니다..

에러는 안나는데..어디가 어떻게 잘못된건지 모르겠네여..

흑흑..알려주세여..



procedure TForm1.Button1Click(Sender: TObject);

var

j, k:integer;

Buf1, buf2, buf3, buf4, buf5, buf6 : pChar;

BufSize1, bufsize2, bufsize3, bufsize4, bufsize5, bufsize6 : integer;

begin



k:=strtoint(edit3.text);

for j:=k to 20 do begin

BufSize1 := Edit1.GetTextLen;

Buf1 := AllocMem(BufSize1);

Edit1.GetTextBuf(Buf1, BufSize1);

FreeMem(Buf1, BufSize1);



BufSize2 := Edit2.GetTextLen;

Buf2 := AllocMem(BufSize2);

Edit2.GetTextBuf(Buf2, BufSize2);

FreeMem(Buf2, BufSize2);



BufSize3 := Edit3.GetTextLen;

buf3 := AllocMem(BufSize3);

Edit3.GetTextBuf(Buf3, BufSize3);

FreeMem(Buf3, BufSize3);



BufSize4 := combobox1.GetTextLen;

Buf4 := AllocMem(BufSize4);

combobox1.GetTextBuf(Buf4, BufSize4);

FreeMem(Buf4, BufSize4);



BufSize5 := combobox2.GetTextLen;

Buf5 := AllocMem(BufSize5);

combobox2.GetTextBuf(Buf5, BufSize5);

FreeMem(Buf5, BufSize5);



// 여기서 필요한 작업을 한다



case (j mod 3) of

1 : begin

BufSize6 := combobox3.GetTextLen;

Buf6 := AllocMem(BufSize6);

combobox3.GetTextBuf(Buf6, BufSize6);

FreeMem(Buf6, BufSize6);

end;



2 : begin

combobox3.text:='B';

BufSize6 := combobox3.GetTextLen;

Buf6 := AllocMem(BufSize6);

combobox3.GetTextBuf(Buf6, BufSize6);

FreeMem(Buf6, BufSize6);

end;



0 : begin

combobox3.text:='C';

BufSize6 := combobox3.GetTextLen;

Buf6 := AllocMem(BufSize6);

combobox3.GetTextBuf(Buf6, BufSize6);

FreeMem(Buf6, BufSize6);

end;

end;

memo1.Lines.Add(buf1);

memo1.Lines.Add(buf2);

memo1.Lines.Add(buf3);

memo1.Lines.Add(buf4);

memo1.Lines.Add(buf5);

memo1.Lines.Add(buf6);

end;

end;

3  COMMENTS
  • Profile
    최용일 2000.08.24 04:19
    안녕하세요. 최용일입니다.



    예를 들어보죠...



    AllocMem // 파일을 연다...

    Buf := 어떤값 // 파일에 쓴다.

    FreeMem // 파일을 삭제한다.

    변수 := Buf // 파일에서 읽어온다. 근데 파일이 어디갔지???



    뭔 말인지 아시겠져?



    ^^ 항상 즐코하세요.



    heimdal wrote:

    > 안녕하세여..헤임달입니다..

    > text로입력받은 6개의 데이터를 버퍼에 저장할려고합니다..

    > 여기서 4개는 한번 입력하면 20번째까지 똑같고 두가지만 1에서 20까지, A,B,C 이렇게 변하게됩니다..

    > 그래서 한번 입력했을때 그 데이터들을 버퍼에 저장하는데여..

    > 확인해보니까 이상한값들이 찍힙니다..

    > 에러는 안나는데..어디가 어떻게 잘못된건지 모르겠네여..

    > 흑흑..알려주세여..

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > j, k:integer;

    > Buf1, buf2, buf3, buf4, buf5, buf6 : pChar;

    > BufSize1, bufsize2, bufsize3, bufsize4, bufsize5, bufsize6 : integer;

    > begin

    >

    > k:=strtoint(edit3.text);

    > for j:=k to 20 do begin

    > BufSize1 := Edit1.GetTextLen;

    > Buf1 := AllocMem(BufSize1);

    > Edit1.GetTextBuf(Buf1, BufSize1);

    > FreeMem(Buf1, BufSize1);

    >

    > BufSize2 := Edit2.GetTextLen;

    > Buf2 := AllocMem(BufSize2);

    > Edit2.GetTextBuf(Buf2, BufSize2);

    > FreeMem(Buf2, BufSize2);

    >

    > BufSize3 := Edit3.GetTextLen;

    > buf3 := AllocMem(BufSize3);

    > Edit3.GetTextBuf(Buf3, BufSize3);

    > FreeMem(Buf3, BufSize3);

    >

    > BufSize4 := combobox1.GetTextLen;

    > Buf4 := AllocMem(BufSize4);

    > combobox1.GetTextBuf(Buf4, BufSize4);

    > FreeMem(Buf4, BufSize4);

    >

    > BufSize5 := combobox2.GetTextLen;

    > Buf5 := AllocMem(BufSize5);

    > combobox2.GetTextBuf(Buf5, BufSize5);

    > FreeMem(Buf5, BufSize5);

    >

    > // 여기서 필요한 작업을 한다

    >

    > case (j mod 3) of

    > 1 : begin

    > BufSize6 := combobox3.GetTextLen;

    > Buf6 := AllocMem(BufSize6);

    > combobox3.GetTextBuf(Buf6, BufSize6);

    > FreeMem(Buf6, BufSize6);

    > end;

    >

    > 2 : begin

    > combobox3.text:='B';

    > BufSize6 := combobox3.GetTextLen;

    > Buf6 := AllocMem(BufSize6);

    > combobox3.GetTextBuf(Buf6, BufSize6);

    > FreeMem(Buf6, BufSize6);

    > end;

    >

    > 0 : begin

    > combobox3.text:='C';

    > BufSize6 := combobox3.GetTextLen;

    > Buf6 := AllocMem(BufSize6);

    > combobox3.GetTextBuf(Buf6, BufSize6);

    > FreeMem(Buf6, BufSize6);

    > end;

    > end;

    > memo1.Lines.Add(buf1);

    > memo1.Lines.Add(buf2);

    > memo1.Lines.Add(buf3);

    > memo1.Lines.Add(buf4);

    > memo1.Lines.Add(buf5);

    > memo1.Lines.Add(buf6);

    > end;

    > end;

  • Profile
    heimdal 2000.08.24 04:33
    잘 모르겠는데여...

    자세하게 설명해주시겠어여??

    제가보기엔 문제없는것같은데..





    최용일 wrote:

    > 안녕하세요. 최용일입니다.

    >

    > 예를 들어보죠...

    >

    > AllocMem // 파일을 연다...

    > Buf := 어떤값 // 파일에 쓴다.

    > FreeMem // 파일을 삭제한다.

    > 변수 := Buf // 파일에서 읽어온다. 근데 파일이 어디갔지???

    >

    > 뭔 말인지 아시겠져?

    >

    > ^^ 항상 즐코하세요.

    >

    > heimdal wrote:

    > > 안녕하세여..헤임달입니다..

    > > text로입력받은 6개의 데이터를 버퍼에 저장할려고합니다..

    > > 여기서 4개는 한번 입력하면 20번째까지 똑같고 두가지만 1에서 20까지, A,B,C 이렇게 변하게됩니다..

    > > 그래서 한번 입력했을때 그 데이터들을 버퍼에 저장하는데여..

    > > 확인해보니까 이상한값들이 찍힙니다..

    > > 에러는 안나는데..어디가 어떻게 잘못된건지 모르겠네여..

    > > 흑흑..알려주세여..

    > >

    > > procedure TForm1.Button1Click(Sender: TObject);

    > > var

    > > j, k:integer;

    > > Buf1, buf2, buf3, buf4, buf5, buf6 : pChar;

    > > BufSize1, bufsize2, bufsize3, bufsize4, bufsize5, bufsize6 : integer;

    > > begin

    > >

    > > k:=strtoint(edit3.text);

    > > for j:=k to 20 do begin

    > > BufSize1 := Edit1.GetTextLen;

    > > Buf1 := AllocMem(BufSize1);

    > > Edit1.GetTextBuf(Buf1, BufSize1);

    > > FreeMem(Buf1, BufSize1);

    > >

    > > BufSize2 := Edit2.GetTextLen;

    > > Buf2 := AllocMem(BufSize2);

    > > Edit2.GetTextBuf(Buf2, BufSize2);

    > > FreeMem(Buf2, BufSize2);

    > >

    > > BufSize3 := Edit3.GetTextLen;

    > > buf3 := AllocMem(BufSize3);

    > > Edit3.GetTextBuf(Buf3, BufSize3);

    > > FreeMem(Buf3, BufSize3);

    > >

    > > BufSize4 := combobox1.GetTextLen;

    > > Buf4 := AllocMem(BufSize4);

    > > combobox1.GetTextBuf(Buf4, BufSize4);

    > > FreeMem(Buf4, BufSize4);

    > >

    > > BufSize5 := combobox2.GetTextLen;

    > > Buf5 := AllocMem(BufSize5);

    > > combobox2.GetTextBuf(Buf5, BufSize5);

    > > FreeMem(Buf5, BufSize5);

    > >

    > > // 여기서 필요한 작업을 한다

    > >

    > > case (j mod 3) of

    > > 1 : begin

    > > BufSize6 := combobox3.GetTextLen;

    > > Buf6 := AllocMem(BufSize6);

    > > combobox3.GetTextBuf(Buf6, BufSize6);

    > > FreeMem(Buf6, BufSize6);

    > > end;

    > >

    > > 2 : begin

    > > combobox3.text:='B';

    > > BufSize6 := combobox3.GetTextLen;

    > > Buf6 := AllocMem(BufSize6);

    > > combobox3.GetTextBuf(Buf6, BufSize6);

    > > FreeMem(Buf6, BufSize6);

    > > end;

    > >

    > > 0 : begin

    > > combobox3.text:='C';

    > > BufSize6 := combobox3.GetTextLen;

    > > Buf6 := AllocMem(BufSize6);

    > > combobox3.GetTextBuf(Buf6, BufSize6);

    > > FreeMem(Buf6, BufSize6);

    > > end;

    > > end;

    > > memo1.Lines.Add(buf1);

    > > memo1.Lines.Add(buf2);

    > > memo1.Lines.Add(buf3);

    > > memo1.Lines.Add(buf4);

    > > memo1.Lines.Add(buf5);

    > > memo1.Lines.Add(buf6);

    > > end;

    > > end;

  • Profile
    최용일 2000.08.24 04:42
    헐~



    FreeMem을 해서 버퍼에 할당된 메모리를 제거하잖습니까? 그럼 그 버퍼에 들어있는



    데이터들이 온전할까요? 예전 도스시절에야 프리해도 그 메모리영역에 대부분 데이터가



    그대로 들어있었지만 윈도우같은 멀티태스킹시스템에서는 수없이 많은 메모리 스왑이



    발생합니다. 그러므로 Free하면 그 메모리 영역에 어떤값이 들어가 있을지는 아무도



    모르죠... 때문에 데이터를 억세스 하는동안에는 프리를 하면 안됩니다.



    FreeMem구문은 버퍼를 다 사용한 뒤에 해주라는 말이었는데...



    예를 들면



    var

    Bmp: TBitmap;

    begin

    Bmp := TBitmap.Create;

    Bmp.LoadFromFile('c:mybmp.bmp');

    Bmp.Free;

    Bmp.SaveToFile('c:mybmp2.bmp');

    // 여기에서 Bmp란 객체가 올바른 메모리영역(위에서 생성시킨 Bmp객체)을 가리킬까요?

    end;



    ^^ 항상 즐코하세요.



    heimdal wrote:

    > 잘 모르겠는데여...

    > 자세하게 설명해주시겠어여??

    > 제가보기엔 문제없는것같은데..

    >

    >

    > 최용일 wrote:

    > > 안녕하세요. 최용일입니다.

    > >

    > > 예를 들어보죠...

    > >

    > > AllocMem // 파일을 연다...

    > > Buf := 어떤값 // 파일에 쓴다.

    > > FreeMem // 파일을 삭제한다.

    > > 변수 := Buf // 파일에서 읽어온다. 근데 파일이 어디갔지???

    > >

    > > 뭔 말인지 아시겠져?

    > >

    > > ^^ 항상 즐코하세요.

    > >

    > > heimdal wrote:

    > > > 안녕하세여..헤임달입니다..

    > > > text로입력받은 6개의 데이터를 버퍼에 저장할려고합니다..

    > > > 여기서 4개는 한번 입력하면 20번째까지 똑같고 두가지만 1에서 20까지, A,B,C 이렇게 변하게됩니다..

    > > > 그래서 한번 입력했을때 그 데이터들을 버퍼에 저장하는데여..

    > > > 확인해보니까 이상한값들이 찍힙니다..

    > > > 에러는 안나는데..어디가 어떻게 잘못된건지 모르겠네여..

    > > > 흑흑..알려주세여..

    > > >

    > > > procedure TForm1.Button1Click(Sender: TObject);

    > > > var

    > > > j, k:integer;

    > > > Buf1, buf2, buf3, buf4, buf5, buf6 : pChar;

    > > > BufSize1, bufsize2, bufsize3, bufsize4, bufsize5, bufsize6 : integer;

    > > > begin

    > > >

    > > > k:=strtoint(edit3.text);

    > > > for j:=k to 20 do begin

    > > > BufSize1 := Edit1.GetTextLen;

    > > > Buf1 := AllocMem(BufSize1);

    > > > Edit1.GetTextBuf(Buf1, BufSize1);

    > > > FreeMem(Buf1, BufSize1);

    > > >

    > > > BufSize2 := Edit2.GetTextLen;

    > > > Buf2 := AllocMem(BufSize2);

    > > > Edit2.GetTextBuf(Buf2, BufSize2);

    > > > FreeMem(Buf2, BufSize2);

    > > >

    > > > BufSize3 := Edit3.GetTextLen;

    > > > buf3 := AllocMem(BufSize3);

    > > > Edit3.GetTextBuf(Buf3, BufSize3);

    > > > FreeMem(Buf3, BufSize3);

    > > >

    > > > BufSize4 := combobox1.GetTextLen;

    > > > Buf4 := AllocMem(BufSize4);

    > > > combobox1.GetTextBuf(Buf4, BufSize4);

    > > > FreeMem(Buf4, BufSize4);

    > > >

    > > > BufSize5 := combobox2.GetTextLen;

    > > > Buf5 := AllocMem(BufSize5);

    > > > combobox2.GetTextBuf(Buf5, BufSize5);

    > > > FreeMem(Buf5, BufSize5);

    > > >

    > > > // 여기서 필요한 작업을 한다

    > > >

    > > > case (j mod 3) of

    > > > 1 : begin

    > > > BufSize6 := combobox3.GetTextLen;

    > > > Buf6 := AllocMem(BufSize6);

    > > > combobox3.GetTextBuf(Buf6, BufSize6);

    > > > FreeMem(Buf6, BufSize6);

    > > > end;

    > > >

    > > > 2 : begin

    > > > combobox3.text:='B';

    > > > BufSize6 := combobox3.GetTextLen;

    > > > Buf6 := AllocMem(BufSize6);

    > > > combobox3.GetTextBuf(Buf6, BufSize6);

    > > > FreeMem(Buf6, BufSize6);

    > > > end;

    > > >

    > > > 0 : begin

    > > > combobox3.text:='C';

    > > > BufSize6 := combobox3.GetTextLen;

    > > > Buf6 := AllocMem(BufSize6);

    > > > combobox3.GetTextBuf(Buf6, BufSize6);

    > > > FreeMem(Buf6, BufSize6);

    > > > end;

    > > > end;

    > > > memo1.Lines.Add(buf1);

    > > > memo1.Lines.Add(buf2);

    > > > memo1.Lines.Add(buf3);

    > > > memo1.Lines.Add(buf4);

    > > > memo1.Lines.Add(buf5);

    > > > memo1.Lines.Add(buf6);

    > > > end;

    > > > end;