안녕하세요!.
한가지 해결하지 못하는 문제가 있어서요.
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에는 값이 있습니다.
코딩이 잘못되었는지, 혹은 다른 방법은 없는지 여러고수님의
지도 바랍니다.
>
> 안녕하세요!.
> 한가지 해결하지 못하는 문제가 있어서요.
>
> 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+}
좋은하루 되세요~