Q&A

  • Pchar를 Reccord로 Move 하려면?


안녕하세요!.

한가지 해결하지 못하는 문제가 있어서요.



Type

Rec1 = record

aa : array[0..2] of char;

bb : array[0..9] of char;

cc : array[0..4] of char;

dd : array[0..1] of char;

Prec1 = ^Rec1;

.

.



Procedure button1click(Sender: TObject);

var arec1 : Prec1;

cp : pchar;

begin

move( arec1, cp, 20);

.

.

end;



실행시 Error가 발생합니다.

물론 cp에는 값이 있습니다.

코딩이 잘못되었는지, 혹은 다른 방법은 없는지 여러고수님의

지도 바랍니다.













1  COMMENTS
  • Profile
    노력하는이 1999.08.03 03:09
    하늘소 께서 말씀하시기를...

    >

    > 안녕하세요!.

    > 한가지 해결하지 못하는 문제가 있어서요.

    >

    > Type

    > Rec1 = record

    > aa : array[0..2] of char;

    > bb : array[0..9] of char;

    > cc : array[0..4] of char;

    > dd : array[0..1] of char;

    > Prec1 = ^Rec1;

    > .

    > .

    >

    > Procedure button1click(Sender: TObject);

    > var arec1 : Prec1;

    > cp : pchar;

    > begin

    > move( arec1, cp, 20);

    > .

    > .

    > end;

    >

    > 실행시 Error가 발생합니다.

    > 물론 cp에는 값이 있습니다.

    > 코딩이 잘못되었는지, 혹은 다른 방법은 없는지 여러고수님의

    > 지도 바랍니다.

    >

    >



    안녕하세요~ (참고로 전 고수는 아님! ^^)



    먼저 pchar는 메모리 할당을 해야합니다. 알고 계신다구요? 네에~

    선언하신 Prec1도 포인터형이기 때문에 마찮가지구요...

    다음은 move함수인데요 위와 같다면 다음처럼 해야 맞습니다.



    move(arec1^,cp^,20); (근데 이건 레코드에서 pchar로 이동하는건데...)



    그리고 pchar는 마지막 바이트가 #0 이 되야하죠.

    그러므로 cp의 크기는 21바이트로 잡은후 다음을 추가해야 합니다.



    byte(cp+20)^=0;



    Pchar를 Reccord로 Move 하려면 다음처럼 순서를 바꾸면 되구요...



    move(cp^,arec1^,20);



    마지막으로 델파이의 레코드 32bit정렬 입니다.(컴파일 옵션에 있습니다!)

    위의 레코드는 총합이 20byte이지만 sizeof해보시면 아니라는것을 알수있습니다.

    델파이는 32비트보다 작은 필드는 무조건 32비트로 만들어버리는 기능(?)을

    가지고 있습니다. 속도가 조금더 빨라진다나...

    이 기능을 일부 레코드만 사용하지 않으려면 다음처럼 합니다.



    {$A-}

    Type

    Rec1 = record

    aa : array[0..2] of char;

    bb : array[0..9] of char;

    cc : array[0..4] of char;

    dd : array[0..1] of char;

    end;

    {$A+}



    좋은하루 되세요~