C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 FAQ
C++Builder Programming FAQ
[18] [TECHNIQUE][VCL] TList에 동적생성한 int 집어 넣기
이영수 [] 20086 읽음    2000-07-31 00:00
제가 델파이 코리아에서 질문한 내용에 대한 길랄라님과 성낙현님의 답변 내용입니다.

TStringList같은 숫자를 집어 넣을 수 있는 Link list없나요??
아는 분 알켜줘요!!

길랄라 wrote:
>안냐심까?  빌더 초짜 길랄라 입니다.. 꾸벅 *^^*
>
>질문의 내용을 제대로 이해 했는지는 잘 모르겠는데요....
>TList를 사용하셔서 정수형을 리스트로 관리 할수도 있습니다.
>TVarRec을 사용하셔도 되구요....
>TVariant를 이용하셔두 될듯 하네여....
>아래는 TList를 사용한 예입니다...
>맞는지 몰게써여....
>
>    int val;
>    TList* intList=new TList();
>
>    for(int a=0;a<100;a++){
>        intList->Add((void*)a);
>    }
>
>    for(int i=0;i<100;i++){
>        val=(int&)intList->Items[i];
>        Memo1->Lines->Add((AnsiString)val);
>    }
>
>    delete intList;
>
>틀린답이라도 이뿌게 봐주세염....--;;
>이상 초짜 길랄라 였습니다...
>좋은 하루 되세여~
>======================================================
>빌더가 날라댕기는 그날까지......화이링... *^^*
>======================================================
>이영수 wrote:
>>TStringList같은 숫자를 집어 넣을 수 있는 Link list없나요??
>>아는 분 알켜줘요!!
>
답변에 대해 깊이 감사드립니다.
길랄라님이 적으신 위의 코드내용을 컴파일 해보니 아무 이상이 없더군요..
근데 한가지 의문점이 있습니다.
아래 부분에서

>    for(int a=0;a<100;a++){
>        intList->Add((void*)a);
>    }
>  이렇게 코딩하면 TList에는 a의 번지 값이 들어가지 안나요??
> 그렇다면 a변수는 하나이므로 TList의 Item에는 같은 변수 a의 번지가 들어
>가게 되므로...똑같은 a의 값 100개가 출려되여 될텐데.. 정상적으로
>0부터 99까지 출력 되니.. 통 알수 없네요..
>시원한 답변 부탁드립니다.
====================================================
안냐심까~  빌더 초짜 길랄라 입니다...
윗 부분에 대해서 말씀드리면여...(저두 포인타는 잘 몰라염,... --;;)

reference 연산자 & 와
castint (int*)의 차이를 이해 하시면 될것 같은데염..... 
예를 들어~
  
   int a=10;
   int* m;
  
   m=&a;  
                <---------1 break point
   m=(int*)a;      
                <---------2 break point

이럴 경우에.....
다음과 같이 변수와 주소와 값을 표시해 보면....

변수명     주소            값
-----------------------------
  a       0x0012f54c      10
  m       0x0012f548      0x0012f54c      <-----------1
             
  a       0x0012f54c      10
  m       0x0012f548      0x0000000a (10) <-----------2

inspector나 eveluate/modify 툴을 사용해서 확인해 보시면
캐스트와... 레퍼런스의 차이를 알수 있을 것 같습니다...

제가 초짜라서.. 답변이 시워치가 않습니다...
죄송하구염.. --;;


길랄라님 예제프로그램 참 절묘하게 짜셨군요.. 하지만 초보자 입장에서 보면 그렇게 작성하면 안될듯 합니다. 그리고 그 방법은 정수형태의 값이면 모르겠지만 실수 형태나 다른 형식의 변수들은 사용하지 못하는 치명적인 결점이 있습니다. Tlist형식에 맞게 문법을 가져 가야 겠죠...

TList의 아이템은 무조건 포인터만 적체될수 있습니다.
아이템의 데이타 형을 보면 (void * ) 인데.. 이는 아이템을 적체하거나
읽을때 타잎케스트에 의해 형식을 결정하고.. Tlist에 들어갈수 있는 오브젝트는 포인터의 어떠한 형태.. 즉 구조체, 클레스, 일반 변수등 무엇이던지 집어 넣을수가 있습니다. 따라서 이곳에 적체시키려면 포인터형이어야 합니다. 일반적인 int나 short 이나 long형태의 변수들도 동적 생성을 하여 Tlist에 집어 넣어 줘야 합니다.

즉.. 다음과 같은 예제가 되어야 합니다.

int i;
int *val;

TList *IntList = new TList();

// 리스트에 적체..
for (i = 0; i < 100; i**) {
val = new int;            // 변수 동적 생성..
*val = i;                 // 새로 생성한 공간에 i값 적체
IntList->Add((int*)Val);  // 리스트에 val포인터 적체
}

// 리스트 검색
for (i = 0; i < 100; i**) {
val = (int *)IntList->Items[i];    // 읽어 들일 포인터 지정
Memo1->Lines->Add(IntToStr(*val));
}

// 리스트 삭제
for (i = 0; i < 100; i**) {
delete (int *)IntList->Items[i];   // 동적생성한 동적변수들 삭제
}

delete IntList;                      // 리스트 삭제..

말나온김에 길랄라님의 소스를 함 보면요..

  int val;
  TList* intList=new TList();

  for(int a=0;a<100;a++){
      intList->Add((void*)a); <-- 이부분이 절묘합니다. 이것은 TList에 a의 포인터가 적체되는것이 아닌 a의 값.. 즉 상수가 적체 됩니다.. 즉 a가 0일경우 a가 가지고 있는값.. 0이라는 상수값이 적체 됩니다. 그러나 이것은 위험한게 이게 정수값이었으니 망정이지 적체될 값이 float이나 다른 형태의 값은 절대 넣을수 없습니다. 따라서 위의 표현은 맞지 않다고 봐야겠죠..
   }

   for(int i=0;i<100;i++){
       val=(int&)intList->Items[i]; <- 이곳역시 오류라 할순 없지만 아이템의 포인터 상수값을 일반 변수 형태로 바꾸어 주는 부분입니다.
       Memo1->Lines->Add((AnsiString)val);
   }

   delete intList;


+ -

관련 글 리스트
18 [TECHNIQUE][VCL] TList에 동적생성한 int 집어 넣기 이영수 20086 2000/07/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.