안녕하세요.. 델파이 넘 모르겠네요..
몇가지 자료를 넣어둔 List 개체에서 item 이 가장 많은
List를 찾으려고 하는데 로직은 맞는거 같은데요 값을 전달하는 부분에서
제가 모르는 것이 있는 듯하네요..
: 생략
private
MaxList, CntList1, CntList2: TList;
: 생략
procedure TForm1.FreeList(var List: TList; ChkFree: Boolean);
var
i: Integer;
begin
for i:=List.Count-1 downto 0 do
FreeMem(List.Items[i]);
if (ChkFree = true) then List.Free
else List.Clear;
end;
FreeList(MaxList, False);
FreeList(CntList1, False);
FreeList(CntList2, False);
RandomListAdd(CntList1); <----개체에 임의의 ITEM들 추가
RandomListAdd(CntList2); <----개체에 임의의 ITEM들 추가
if CntList1.Count > CntList2.Count then
MaxList := CntList1
else
MaxList := CntList2;
이렇게 (위와같이) 하면 되거든요... MaxList에 분명 정확히 가장
많은 ITEM이 든 객체가 나오는 데 왜 아래와 같이 하면 안나오죠..?
문제의 함수 부분
FreeList(MaxList, False);
for i:=1 to 10 do begin
FreeList(CntList1, False);
RandomListAdd(CntList1); <---- 개체에 임의의 ITEM들 추가
if CntList1.Count > MaxList.Count then
MaxList := CntList1; <---- 이부분이 문제인듯한데, Item을 넘겨주는게
아니라 그 포인트만 넘기는 듯하더라고요
end;
위의 소스가 지금 문제인데,
MaxList := CntList1; 이 줄이 문제인듯해요..
그냥 Item을 복사해서 넘겨주는 것이 아니라 포인트를 넘겨주기때문인 것 같거든요.
가장 Item이 많은 List가 MaxList에 들어가야 하는데 실제로 돌려보면
가장 마지막 List가 MaxList에 들어가 있더군요..
가장 많은 List가 MaxList에 들어가려면 이부분을 어떻게 고쳐야 하죠?
처음거는 CntList1, CntList2가 다르니까 별문제가 없네요. 상황에 따라서 MaxList가
CntList1나 CntList2 둘중의 하나를 가리킵니다.
두번째것은 CtnList1만을 사용하셨네요. 처음에(i=1) MaxList가 CtnList1을 가리키고,
두개의 객체는 동일한객체입니다. 그 다음에(i=2일때) FreeList를 해서 CtnList1의
아이템들을 삭제하셨죠. 이 시점에서 MaxList의 아이템들도 삭제되게 됩니다. 두개의
객체가 같으므로... 이런식으로 돌기때문에 마지막 리스트를 MaxList가 가리키게
되는겁니다...
MaxList를 포인터로 하시지 마시고 직접 객체를 생성해서 하셔야 합니다. TList 에는
Assign메소드가 없으므로 for문으로 직접 옮겨주셔야 겠군요...
var
J: Integer;
Item: Pointer;
begin
// MaxList가 폼의 내부필드인거 같으니까 이부분은 OnCreate 이벤트에서 하셔야
// 할거 같군요..
MaxList := TList.Create;
FreeList(MaxList, False);
for i:=1 to 10 do
begin
FreeList(CntList1, False);
RandomListAdd(CntList1);
if CntList1.Count > MaxList.Count then
begin
// **********************************************************
FreeList(MaxList, False);
for J := CtnList1.Count - 1 downto 0 do
begin
Item := CtnList1.Items[J];
CtnList1.Delete(J)
MaxList.Add(Item));
end;
// **********************************************************
end;
end;
// 이부분도 폼의 OnDestroy 이벤트에서 하셔야 할거 같군요..
FreeList(MaxList, False);
MaxList.Free; end;
^^ 항상 즐코하세요...
궁금이 wrote:
> 안녕하세요.. 델파이 넘 모르겠네요..
>
> 몇가지 자료를 넣어둔 List 개체에서 item 이 가장 많은
> List를 찾으려고 하는데 로직은 맞는거 같은데요 값을 전달하는 부분에서
> 제가 모르는 것이 있는 듯하네요..
>
> : 생략
>
> private
> MaxList, CntList1, CntList2: TList;
>
> : 생략
>
> procedure TForm1.FreeList(var List: TList; ChkFree: Boolean);
> var
> i: Integer;
> begin
> for i:=List.Count-1 downto 0 do
> FreeMem(List.Items[i]);
>
> if (ChkFree = true) then List.Free
> else List.Clear;
> end;
>
> FreeList(MaxList, False);
> FreeList(CntList1, False);
> FreeList(CntList2, False);
>
> RandomListAdd(CntList1); <----개체에 임의의 ITEM들 추가
> RandomListAdd(CntList2); <----개체에 임의의 ITEM들 추가
>
> if CntList1.Count > CntList2.Count then
> MaxList := CntList1
> else
> MaxList := CntList2;
>
>
> 이렇게 (위와같이) 하면 되거든요... MaxList에 분명 정확히 가장
> 많은 ITEM이 든 객체가 나오는 데 왜 아래와 같이 하면 안나오죠..?
>
>
>
>
> 문제의 함수 부분
>
> FreeList(MaxList, False);
>
> for i:=1 to 10 do begin
> FreeList(CntList1, False);
> RandomListAdd(CntList1); <---- 개체에 임의의 ITEM들 추가
> if CntList1.Count > MaxList.Count then
> MaxList := CntList1; <---- 이부분이 문제인듯한데, Item을 넘겨주는게
> 아니라 그 포인트만 넘기는 듯하더라고요
> end;
>
>
> 위의 소스가 지금 문제인데,
> MaxList := CntList1; 이 줄이 문제인듯해요..
> 그냥 Item을 복사해서 넘겨주는 것이 아니라 포인트를 넘겨주기때문인 것 같거든요.
> 가장 Item이 많은 List가 MaxList에 들어가야 하는데 실제로 돌려보면
> 가장 마지막 List가 MaxList에 들어가 있더군요..
> 가장 많은 List가 MaxList에 들어가려면 이부분을 어떻게 고쳐야 하죠?
>
>
>