Q&A

  • 동적으로 생성한 Null을 포함한 문자열 처리
다음의 내용은



처음 10자리를 문자열로 쓰고

다음 4자리를 Integer

다음 8자리를 Double이 사용하는 문자열을 만들어

다른곳에 넘기는 프로그램입니다.



일단은 파일에 쓰는 예제로 만들었습니다.

그런데 동적으로 생성한 메모리는 파일에 다른값을 쓰네요.

디버그모드로 확인하면 제대로 들어가 있는데 파일엔 엉뚱한 값이 들어있네요.



//=======================================================

procedure AAA;

//=======================================================

var x, nPos, FileHandle : Integer;

sText : String;

nData : Integer; fData : Double;

Buff : PChar;

begin

FileHandle := FileCreate('C:jhj.log'); // log



GetMem(Buff,30);

FillMemory(Buff,30,0);



nPos := 0;

sText := '12345';

x := Length(sText);

CopyMemory(Buff + nPos,PChar(sText),x);



nPos := nPos + 10;

nData := 1;

x := 4;

CopyMemory(Buff + nPos,@nData,x);



nPos := nPos + x;

fData := 1.1;

x := 8;

CopyMemory(Buff + nPos,@fData,x);



nPos := nPos + x;

FileWrite(FileHandle,Buff,nPos); // log

FreeMem(Buff);

FileClose(FileHandle); // log

end;



//=======================================================

procedure BBB;

//=======================================================

var x, nPos, FileHandle : Integer;

sText : String;

nData : Integer; fData : Double;

aBuff : array [0..255] of Char;

begin

FileHandle := FileCreate('C:jhj.log'); // log



FillChar(aBuff,255,0);



nPos := 0;

sText := '12345';

x := Length(sText);

CopyMemory(aBuff + nPos,PChar(sText),x);



nPos := nPos + 10;

nData := 1;

x := 4;

CopyMemory(aBuff + nPos,@nData,x);



nPos := nPos + x;

fData := 1.1;

x := 8;

CopyMemory(aBuff + nPos,@fData,x);



nPos := nPos + x;

FileWrite(FileHandle,aBuff,nPos); // log

FileClose(FileHandle); // log

end;



AAA와 BBB의 결과가 다릅니다.

AAA가 이상하게 나옵니다.

BBB처럼 하면 동적으로 크기를 잡을 수 없기 때문에 안되고요.

좋은 해결책이 있을것 같은데...





1  COMMENTS
  • Profile
    정형준 2001.06.13 20:22
    정형준 wrote:

    > 다음의 내용은

    >

    > 처음 10자리를 문자열로 쓰고

    > 다음 4자리를 Integer

    > 다음 8자리를 Double이 사용하는 문자열을 만들어

    > 다른곳에 넘기는 프로그램입니다.

    >

    > 일단은 파일에 쓰는 예제로 만들었습니다.

    > 그런데 동적으로 생성한 메모리는 파일에 다른값을 쓰네요.

    > 디버그모드로 확인하면 제대로 들어가 있는데 파일엔 엉뚱한 값이 들어있네요.

    >

    > //=======================================================

    > procedure AAA;

    > //=======================================================

    > var x, nPos, FileHandle : Integer;

    > sText : String;

    > nData : Integer; fData : Double;

    > Buff : PChar;

    > begin

    > FileHandle := FileCreate('C:jhj.log'); // log

    >

    > GetMem(Buff,30);

    > FillMemory(Buff,30,0);

    >

    > nPos := 0;

    > sText := '12345';

    > x := Length(sText);

    > CopyMemory(Buff + nPos,PChar(sText),x);

    >

    > nPos := nPos + 10;

    > nData := 1;

    > x := 4;

    > CopyMemory(Buff + nPos,@nData,x);

    >

    > nPos := nPos + x;

    > fData := 1.1;

    > x := 8;

    > CopyMemory(Buff + nPos,@fData,x);

    >

    > nPos := nPos + x;

    > FileWrite(FileHandle,Buff,nPos); // log

    > FreeMem(Buff);

    > FileClose(FileHandle); // log

    > end;

    >

    > //=======================================================

    > procedure BBB;

    > //=======================================================

    > var x, nPos, FileHandle : Integer;

    > sText : String;

    > nData : Integer; fData : Double;

    > aBuff : array [0..255] of Char;

    > begin

    > FileHandle := FileCreate('C:jhj.log'); // log

    >

    > FillChar(aBuff,255,0);

    >

    > nPos := 0;

    > sText := '12345';

    > x := Length(sText);

    > CopyMemory(aBuff + nPos,PChar(sText),x);

    >

    > nPos := nPos + 10;

    > nData := 1;

    > x := 4;

    > CopyMemory(aBuff + nPos,@nData,x);

    >

    > nPos := nPos + x;

    > fData := 1.1;

    > x := 8;

    > CopyMemory(aBuff + nPos,@fData,x);

    >

    > nPos := nPos + x;

    > FileWrite(FileHandle,aBuff,nPos); // log

    > FileClose(FileHandle); // log

    > end;

    >

    > AAA와 BBB의 결과가 다릅니다.

    > AAA가 이상하게 나옵니다.

    > BBB처럼 하면 동적으로 크기를 잡을 수 없기 때문에 안되고요.

    > 좋은 해결책이 있을것 같은데...

    >

    >



    맨 마지막 파일에 쓸때 Buff 대신 Buff[0]을 넘겨주면 됩니다.

    혹은 Pointer(Buff)^를 넘겨줘도 된다는군요.



    서용혁씨 고맙습니다.



    //=======================================================

    procedure AAA;

    //=======================================================

    var x, nPos, FileHandle : Integer;

    sText : String;

    nData : Integer; fData : Double;

    Buff : PChar;

    begin

    FileHandle := FileCreate('C:jhj.log'); // log



    GetMem(Buff,30);

    FillMemory(Buff,30,0);



    nPos := 0;

    sText := '12345';

    x := Length(sText);

    CopyMemory(Buff + nPos,PChar(sText),x);



    nPos := nPos + 10;

    nData := 1;

    x := 4;

    CopyMemory(Buff + nPos,@nData,x);



    nPos := nPos + x;

    fData := 1.1;

    x := 8;

    CopyMemory(Buff + nPos,@fData,x);



    nPos := nPos + x;

    FileWrite(FileHandle,Buff[0],nPos); // log

    FreeMem(Buff);

    FileClose(FileHandle); // log

    end;