MFC CArray 2차원 배열 예제 및 3가지 사용 방법


MFC CArray 사용법 2차원 배열[C++ MFC 배열 입력 출력 예제]


MFC CArray 사용법

아래는 CArray를 사용하는 간단한 예제로 2차원 배열로 선언한 예입니다. 이중 배열로 선언해 사용하기 위해선 typedef를 먼저 만들어야 합니다.


1
2
typedef CArray <doubledouble>
CArrayType;
cs


다음엔 아래와 같이 MFC CArrayType을 선언합니다.


1
CArrayType Doubles;
cs


그리고, 항목을 추가합니다. (D는 Double형 변수)


1
Doubles.Add (D);
cs


다시, 반복문으로 채워봅니다.


1
2
3
4
5
int n = Doubles.GetSize();
 
for (Index=0; Index<n; ++Index) {
    d = Doubles[Index]
}
cs


항목을 모두 지울 땐 아래처럼 합니다.


1
Doubles.RemoveAll;
cs


내부 항목들은 포인터로 선언되지 않기에 깨끗하게 내부를 비워낼 수 있습니다.

MFC CArray of CArray : 기본 사용법

CArray의 CArray를 생성하는 기본적인 코드는 아래와 같습니다.


1
2
3
4
5
6
7
8
class CDoublesArray : public CArray<doubledouble> {
 
public:
    void operator= (const CDoublesArray& DoublesArray) {
    RemoveAll();
    Append(DoublesArray);
    }
};
cs


생성한 뒤, 2차원 배열 사용하는 예는 아래와 같습니다.


1
2
3
4
5
6
7
CArray<CDoublesArray, CDoublesArray&> ArrayArray;
CDoublesArray DoublesArray;
 
DoublesArray.Add(9);
DoublesArray.Add(99);
 
ArrayArray.Add(DoublesArray);
cs


MFC CArray 사용법, 2차원 배열 예제 (CArray of CArray)[C++ MFC 배열 입력 출력 예제]


MFC CArray of CArray : 복합 사용법

클래스나 구조체의 CArray of CArray를 생성하기 위해선 복사 생성자가 필요합니다. 그래서, 아래처럼 하나의 클래스를 먼저 생성합니다.


1
2
3
4
5
class CBase {
 
public:
    int BasePoly;
};
cs


CBase 클래스를 기반으로 클래스의 CArray를 생성할 수 있습니다. 2차원 배열은 CArray of CArray로 표현합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
class CBaseArray : public CArray<CBase, CBase&> {
public:
    CBaseArray() : CArray<CBase, CBase&>() {};
 
    CBaseArray(const CBaseArray &BaseArray) {
        RemoveAll();
        Append(BaseArray);    
        }
 
    void operator= (const CBaseArray &BaseArray) {
        RemoveAll();
        Append(BaseArray);    
        }
};
cs


아래의 코드는 MFC CArray 클래스와 CArrayBase 클래스를 응용한 2차원 배열 사용법니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int i1, i2;
CBase Base;
CBaseArray BaseArray;
CArray<CBaseArray, CBaseArray&> BaseArrayArray;
 
Base.BasePoly = 99; BaseArray.Add(Base);
Base.BasePoly = 98; BaseArray.Add(Base);
Base.BasePoly = 59; BaseArray.Add(Base);
 
BaseArrayArray.Add(BaseArray);
BaseArray.RemoveAll();
 
Base.BasePoly = 9; BaseArray.Add(Base);
Base.BasePoly = 8; BaseArray.Add(Base);
Base.BasePoly = 5; BaseArray.Add(Base);
 
BaseArrayArray.Add(BaseArray);
 
for (i1 = 0; i1 < BaseArrayArray.GetSize(); ++i1) {
    for (i2 = 0; i2 < BaseArrayArray[i1].GetSize(); ++i2) {        
        // Do something with BaseArrayArray[i1][i2]
    }
}
cs


관련 글

CArray 배열 사용 방법

https://codingcoding.tistory.com/488


CByteArray 사용법

https://codingcoding.tistory.com/846


3가지 배열 예제 (CByteArray, CWordArray, CUnitArray)

https://codingcoding.tistory.com/489


동적 메모리 할당 이해하기

https://codingcoding.tistory.com/645

댓글(4)

  • nice
    2018.03.08 15:18

    Doubles가 결국 2차원 배열이니 Doubles[i][k] 이런 형태 일 텐데요.
    int n = Doubles.GetSize();
    for (Index=0; Index<n; ++Index) {
    d = Doubles[Index]
    }
    이 코드는 1차원 배열 처럼 사용한것 같은데요.
    2차원 형태로 사용하려고 아래와 같이 할 때
    for (i=0; i<??; ++i) {
    for (k=0; k<??; ++k)
    d[i][k] = Doubles[i][k]; <--- ??
    }
    ?? 부분을 어떻게 해야 하는지요?

    • 2018.03.08 17:23 신고

      for (i=0; i<Doubles.GetSize(); ++i) {
      for (k=0; k<Doubles[i].GetSize(); ++k)
      d[i][k] = Doubles[i][k]; <--- ??
      }

      이런 식으로 하면 될 겁니다.

      첫 번째 반복문에선 배열 전체의 크기 (행 숫자)
      두 번째 반복문에선 특정 행의 크기 (열 숫자)

      기준으로 작업하시면 돼요.

      그리고 요즘 코딩하시려면 MFC에서 제공하는 CArray 대신에 쌍으로 사용할 수 있는 튜플이나 맵을 사용하세요. C++11 이후로 제공되는 것인데 사용하기 편리합니다.

  • nice
    2018.03.08 18:55

    먼저 답변에 감사드립니다.
    알려주신대로 해보았는데,
    Doubles[i].GetSize(); 가 에러가 나네요..
    따라서 Doubles[i][k]; 도 에러가 나고요..

    아래 처럼 2차원배열 루프로 데이터를 넣었고,
    Doubles.Add(fRawData[k][i]);

    이후 Doubles에서 역으로 2차원 배열에 넣고 싶은것이 목적입니다.

    그리고, 튜플, 맵은 처음 듣는것이라서..ㅠㅠ

    • 2018.03.09 09:38 신고

      제가 MFC 오랜만이라 답글을 잘못 달았네요.

      본문 중간에 "MFC CArray of CArray : 복합 사용법"을 참조해주세요.

Designed by JB FACTORY