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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[685] 동적 어레이 클래스 (Dynamic Array Class) for C++Builder, VC++
김태선 [cppbuilder] 9876 읽음    2007-07-23 17:59
빌더에 동적 배열을 처리하기 위한
DynamicArray 클래스가 있습니다.
원래 델파이의 동적배열 처리를 옮길때 쓰기 위해 디자인 되었는데,
의외로 잘 안쓰는 듯 합니다.
저의 경우도 제가 만든 것을 쓰고 있는데, 아무래도 볼랜드에서 만든게 손에 익으면 매우 편리하겠죠.

아래는 매우 심플하게 동적배열을 다룰수 있는 템플릿 클래스입니다.
소스를 보시면 금방 이해가 되리라 생각됩니다.
여러가지 기능은 없고, 다면 동적으로 배열을 다루는 매우 단순한 처리만을 합니다.
하지만 대부분의 동적 배열 응용에 필요한 것은 갖추고 있는 셈입니다.
아주 복잡한 클래스를 동적 배열(포인트가 아닌 인스턴스로)로 생성해 처리하는 것은
어떨지 모르겠으나(아마 생각지 못한 문제가 생기겠죠)
간단한 형이나 흔히 쓰는 단순한 구조체는 심플하고 간결하게 잘 동작합니다

간단히 쓰고 싶은 분께는 적절할 것입니다.
방금 만든 것이고 소스를 적당히 고쳐서 써도 무방합니다.
//---------------------------------------------------------------------------

#include 
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// 동적 어레이 클래스 (Dynamic Array Class) for C++Builder, VC++
//      동적으로 변하는 크기의 아이템을 다룰때 매우 편리하다.
//		델파이의 array of 형; 처럼 사용 가능하다.
// 		델파이의 array of 형; 에 대응하여 그대로 사용해도 된다.
//
//
// 간단한 형은 무리없이 쓸수 있으나, 다양한 동작을 하는 클래스인 경우
//		소스를 잘보고 적용할 것.
//		아래 예제외는 테스트 안해 봤으나, 웬만한 형은 잘 될 것으로 판단됨.
//
// Written by 김태성


template
class DynaArray
{
private:
	T*		t;
	bool	bAutoClear;
public:
	int		Count;
public:
	DynaArray(bool _bAutoClear = true)
	{
		t = NULL;
		Count = 0;
		bAutoClear = _bAutoClear;
	}
	~DynaArray()
	{
		Clear();
	}
	void	Clear()
	{
		if (t)
			delete[] t;
		t = NULL;
		Count = 0;
	}
	void	SetLength(int size)
	{
		if (size == 0)
		{
			Clear();
			return;
		}
		T* t2 = new T[size];
		if (t)
		{
			for(int c = 0; c < size && c < Count; c++)
			{
				t2[c] = t[c];
			}
			// 배열이 크지는 경우는 숫자형인 경우는 자동으로 0으로 채우면 좋다.
			if (bAutoClear)
			{
				while(Count < size)
				{
					t2[Count++] = 0;
				}
			}
			delete[] t;
		}
		t = t2;
		Count = size;
	}
	T&	operator[](int index)
	{
		return t[index];
	}
	// int* p = 여기에 대입될때는 배열의 첫번째 번지가 대입되게 한다.
	operator T*()
	{
		return t;
	}
};

typedef	DynaArray				ArrayInt;
typedef	DynaArray		ArrayUInt;
typedef	DynaArray				ArrayByte;
typedef	DynaArray			ArrayShort;
typedef	DynaArray	ArrayUShort;
		// 기타 간단한 형은 알아서 정의해 사용하면 됨.

// 스트링형이나 TDate 형 struct, class등 자체적으로 초기화를 한 경우는 0을 대입하면 안될수 있으므로 이렇게 형을 다시 정의한다.

template
class DynaArray2 : public DynaArray
{
public:
	DynaArray2() : DynaArray(false) {}
};

typedef	DynaArray2			ArrayString;
typedef	DynaArray2		ArrayTTime;
		// 기타 복잡한 형은 알아서 정의해 사용하면 됨.


// 테스트...

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	ArrayInt	aa;
	aa.SetLength(10);
	for(int c = 0; c < aa.Count; c++)
	{
		aa[c] = c;
	}
	aa.SetLength(5);
	for(int c = 0; c < aa.Count; c++)
	{
		Memo1->Lines->Add(aa[c]);
	}
	Memo1->Lines->Add("");
	aa.SetLength(8);
	for(int c = 0; c < aa.Count; c++)
	{
		Memo1->Lines->Add(aa[c]);
	}
	Memo1->Lines->Add("");

	ArrayString		ss;
	ss.SetLength(10);
	for(int c = 0; c < ss.Count; c++)
	{
		ss[c] = String().sprintf("%d 번 항목임다.", c);
	}
	for(int c = 0; c < ss.Count; c++)
	{
		Memo1->Lines->Add(ss[c]);
	}
	Memo1->Lines->Add("");
	ss.SetLength(5);
	for(int c = 0; c < ss.Count; c++)
	{
		Memo1->Lines->Add(ss[c]);
	}
	Memo1->Lines->Add("");
	ss.SetLength(7);
	for(int c = 0; c < ss.Count; c++)
	{
		Memo1->Lines->Add(ss[c]);
	}
	Memo1->Lines->Add("문자열은 크기를 늘이면 자동 빈문자열로 할당된다.");


}
//---------------------------------------------------------------------------

끝.
장성호 [nasilso]   2007-07-23 18:31 X
바로 밑에 "문자열검색"관련 팁에서
제가 "궁금한점"이라고 적은것에 대한 답변인것 같네요
감사합니다.
제게 매우 유용히 팁인것 같습니다.
김태선 [cppbuilder]   2007-07-23 19:12 X
^^;
초보대왕 [sauron]   2007-07-25 18:13 X
왜 이런때 vector  를 안쓰실까요.
장성호 [nasilso]   2007-07-25 18:43 X
vector를 안쓰는 이유요?

제 경우에는 stl을 잘 몰라서 그래요


+ -

관련 글 리스트
685 동적 어레이 클래스 (Dynamic Array Class) for C++Builder, VC++ 김태선 9876 2007/07/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.