본문 바로가기

Coding Note

[C++] 다차원 배열 파라미터


ArrayType NDArray[x][y][z]...[w] 인 다차원 배열.

함수의 파라미터로 전달하려면?


방법 1 - const size array parameter

상수크기배열이라면 이 방법이 제일 좋다.

void func(ArrayType NDArr[x][y][z]...[w]){

//여기서 x~...w는 상수 (const 또는 define된..) 이어야한다.

//그리고

NDArr[1][2][3]...[4] = VALUE;

//로 쉽게 접근가능하다.

}


하지만 이 방법은 다차원 배열의 크기가 고정적이어야만 하다.


방법 2 - C style

배열의 포인터연산을 이용해서 원하는 위치로 다이렉트 접근한다.

void func(ArrayType* NDPtr, int x, int y, int z, ..., int w){

//NDArray[1][2][3]..[4]에 접근하려면,

*(NDPtr + (1*(y*z*...*w)) + (2*(z*...*w)) + (3*(...*w)) + ... + 4) = VALUE;

//무진장 복잡하고 관리하기 힘들다.

}


방법 3 - C++ template


template<int SizeX, int SizeY, int SizeZ, ..., int SizeW>

void func(ArrayType NPArr[SizeX][SizeY][SizeZ]...[SizeW]){

//템플릿을 통해서 컴파일타임에 바인딩되게 할 수 있다.

//단지 func(NDArray)와 같이 호출하면 되고, 컴파일시 알아서 해당사이즈의 함수를 생성한다.

//접근도 쉽다.

NPArr[1][2][3]...[4] = VALUE;

}



마지막 방법이 위 세가지 방법 중 가장 유들유들한 방법이다. 

하지만 템플릿은 컴파일타임 바인딩이기 때문에 동적 배열에 대한 처리는 불가능하다.

그래서 동적인 배열에 대한 처리만 따로 오버로딩 시켜주면 된다.


void func(ArrayType ***..* NPPtr, int x, int y, int z, ..., int w){

//여기서 NPPtr은 동적으로 생성된 다차원배열이다.


//이유는 모르겠지만 ㄷㄷ...

//동적인 배열에 대한 포인터는 [] 연산자를 사용할 수 있다. 고로,

NPPtr[1][2][3]...[4] = VALUE;

//로 접근가능

}

'Coding Note' 카테고리의 다른 글

[winAPI] win32 i/o cancellation  (0) 2012.08.07
[MFC] MDI tab에 다른 기능의 자식 추가  (0) 2012.07.15
[C++] C++ callback and delegate  (0) 2012.05.27
[Data Structure] Red Black Tree  (0) 2012.05.27
[Lua] table  (0) 2012.03.19