안녕하세요. 저는 포인터에 대한 질문좀 할려고 합니다. c를 할때도 느낀것이지만 포인터에 대한 공포가 잘 안없었지네요...ㅠ.ㅠ;;
하여튼 포인터를 쓰면 편하기는 하지만 너무 헷갈려서리..
이번에 "파워오브델파이"를 보다가 신기한 컴포넌트가 있더군요. 폼의 모양을 마음대로 바꾸는 컴포넌트데요. 써보니까 편하기도 해서 소스를 보다가 이상한점을 발견했읍니다..
일단 소스의 일부분입니다..
procedure TTracePixel.StartTrace;
type
TPixelArray = Array [0..0] of TPoint;
var
ix, iy, ox, oy : integer;
first_x,first_y : integer;
iCount : integer;
VectorizedPixels : ^TPoint;
PixelList : TList;
PixelArray : ^TPixelArray;
begin
new( VectorizedPixels );
VectorizedPixels^.x := first_x;
VectorizedPixels^.y := first_y;
PixelList.Add( VectorizedPixels );
repeat
TraceBitmap(ix,iy,ox,oy);
new( VectorizedPixels );
VectorizedPixels^.x := ix;
VectorizedPixels^.y := iy;
PixelList.Add( VectorizedPixels );
until (ix = first_x) and (iy = first_y);
{ 점의 갯수만큼의 배열을 동적으로 할당한다. }
GetMem( PixelArray, PixelList.Count * SizeOf(TPoint) );
for iCount := 0 to PixelList.Count - 1 do
begin
// 이곳이 문제의 부분입니다. $$$%%%@@~!@#$##$#@!%!@~@~
PixelArray[iCount].x := PPoint(PixelList.Items[0])^.x + Left;
PixelArray[iCount].y := PPoint(PixelList.Items[0])^.y + Top;
// 이곳이 문제의 부분입니다. $$$%%%@@~!@#$##$#@!%!@~@~
Dispose(PPoint(PixelList.Items[0]));
PixelList.Delete(0);
end;
위에서처럼 PPoint라는 형으로 사용을하였는데.. 그런형은 또 처음이구요.
또 왜저렇게 사용하였는지도 잘....
제 생각에는 리스트형으로 선언된 PixelList를 위에서 부터 하나하나씩 제거해주는 형때인것 같은데 저런 형은 처음보거든요. 그래서 어디 사용자 정의형인것같아서 소스를 프린트해서까지 보았지만 역시 모르겠더군요.. 저에게 이번에 포인터에 대한 공포가 가실수 있도록 대답좀해주세요. 후후
혹시 질문이 길어서 싫증나시더라도 고수분들의 도움 꼭 부탁드립니다.
PPoint는 TPoint의 Pointer형입니다.
PixelList.Items[0]를 TPoint의 Pointer형으로 TypeCasting한것이죠.
최덕환 wrote:
> 안녕하세요. 저는 포인터에 대한 질문좀 할려고 합니다. c를 할때도 느낀것이지만 포인터에 대한 공포가 잘 안없었지네요...ㅠ.ㅠ;;
> 하여튼 포인터를 쓰면 편하기는 하지만 너무 헷갈려서리..
> 이번에 "파워오브델파이"를 보다가 신기한 컴포넌트가 있더군요. 폼의 모양을 마음대로 바꾸는 컴포넌트데요. 써보니까 편하기도 해서 소스를 보다가 이상한점을 발견했읍니다..
> 일단 소스의 일부분입니다..
>
> procedure TTracePixel.StartTrace;
>
> type
> TPixelArray = Array [0..0] of TPoint;
>
> var
> ix, iy, ox, oy : integer;
> first_x,first_y : integer;
> iCount : integer;
> VectorizedPixels : ^TPoint;
> PixelList : TList;
> PixelArray : ^TPixelArray;
>
> begin
> new( VectorizedPixels );
> VectorizedPixels^.x := first_x;
> VectorizedPixels^.y := first_y;
> PixelList.Add( VectorizedPixels );
>
> repeat
>
> TraceBitmap(ix,iy,ox,oy);
>
> new( VectorizedPixels );
> VectorizedPixels^.x := ix;
> VectorizedPixels^.y := iy;
> PixelList.Add( VectorizedPixels );
> until (ix = first_x) and (iy = first_y);
>
> { 점의 갯수만큼의 배열을 동적으로 할당한다. }
> GetMem( PixelArray, PixelList.Count * SizeOf(TPoint) );
>
> for iCount := 0 to PixelList.Count - 1 do
>
> begin
>
> // 이곳이 문제의 부분입니다. $$$%%%@@~!@#$##$#@!%!@~@~
>
> PixelArray[iCount].x := PPoint(PixelList.Items[0])^.x + Left;
> PixelArray[iCount].y := PPoint(PixelList.Items[0])^.y + Top;
>
> // 이곳이 문제의 부분입니다. $$$%%%@@~!@#$##$#@!%!@~@~
>
> Dispose(PPoint(PixelList.Items[0]));
> PixelList.Delete(0);
> end;
>
>
> 위에서처럼 PPoint라는 형으로 사용을하였는데.. 그런형은 또 처음이구요.
> 또 왜저렇게 사용하였는지도 잘....
> 제 생각에는 리스트형으로 선언된 PixelList를 위에서 부터 하나하나씩 제거해주는 형때인것 같은데 저런 형은 처음보거든요. 그래서 어디 사용자 정의형인것같아서 소스를 프린트해서까지 보았지만 역시 모르겠더군요.. 저에게 이번에 포인터에 대한 공포가 가실수 있도록 대답좀해주세요. 후후
>
> 혹시 질문이 길어서 싫증나시더라도 고수분들의 도움 꼭 부탁드립니다.