|
int iVals[10];
위 배열이라면
iVals[0] ~ iVals[9] 가 유효한 배열원소들입니다(각 원소가 갖는 값과는 상관 없이).
iVals[10]부터는 액세스하게 되면 오류입니다.
TList의 Items는 내부의 동적인 포인터 배열을 액세스하기 위한 property로서
위의 일반적인 배열과 대부분 같지만 다음 사항에 있어서 조금 다릅니다.
현재 20 개의 원소의 포인터를 저장하기 위한 메모리(Capacity)가 할당되어 있더라도 실제 유효한 원소의 갯수(Count)가 5개라면 Items[5] 부터는 액세스하게 되면 님이 제시한 오류를 발생시킵니다.
원소의 갯수(Count)는 Add, Clear, Remove, Delete 메서드를 호출할 때 증감합니다.
TList의 인스턴스를 생성 후 Add를 호출하기 전까지는 Count는 0입니다.
쉽게 말하면 int iVals[0];과 같은 상황입니다(물론,크기가 0인 배열은 못만들지만 설명을 위한 것임).
이러한 상황에서 iVals[0], iVals[1], iVals[2] ... 을 액세스한 게 님의 코드입니다.
실제로 그렇지는 않지만, 이해하기 쉽게 하려면 Add를 호출할 때마다 내부 배열의 크기가 증가한다고 생각하면 되겠습니다.
(Remove, Delete를 호출하면 감소하고 Clear를 호출하면 0이 되고..)
TList::Items[index]에 대입(=)을 한다고 해서 Add()되는 것이 아닙니다.
= 연산자는 index가 유효범위 이내인 경우에 한해서 해당 위치의 값을 읽거나 변경하는 것입니다.
최민희 님이 쓰신 글 :
: 소스는 대략 이렇습니다. 그냥 간단히 함수 하나 만들어 봣어요
:
: //---------------------------------------------------------------------------
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: TList *list = new TList;
: TestTList(list);
:
: for(int i = 0; i <= list->Count-1 ; i++)
: {
: Memo1->Lines->Add( list->Items[i] );
: }
: delete list;
: }
: //---------------------------------------------------------------------------
: void TestTList(TList *list)
: {
: for(int i = 0; i <= 100 ; i++)
: {
: list->Items[i] = "aaaaaaaaaa";
: }
: }
: //-------------------------------------------------------------------------
:
: 『list->Items[i] = "aaaaaaaaaa";』 이부분에서 에러가 나더라구요
: 『list out of bounds』라는 에러가 떠요..잘못한것두 없는데
: 근데 『list->Add(aaaaaaaaaa);』 를 쓰면 되거든요
: 왜 Items[i]는 왜 안먹히는 거죠?
:
: 언니 오빠들의 답변 기달리겟습니다. 감사합니다.
:
|