2010-02-07 5 views
1

나는 내 교수님에게서 질문을 받았습니다. 데이터 타입으로 인해 int 포인터가 아닌 동적 인 2D 배열을 생성하기 위해 void 포인터를 사용하는 것이 더 일반적입니다.void 포인터를 사용하여 C++에서 2D 배열을 만드는 방법은 무엇입니까?

하지만 난 아무 생각이 방법을 사용하여 만들 수 없습니다했습니다 ->void***m // data type is void* pointer

사람이에 대한 예제를 줄 수 있습니까? 답을 고맙게 생각합니다. 많은 감사합니다! 내가 그런 식으로해야 할 일을했을 경우

+0

인라인 asm을 사용하고 인덱스 레지스터에 직접 액세스하는 것이 배열 액세스에 void 포인터를 사용하는 것보다 훨씬 더 일반적이라는 사실을 알려주십시오. –

+0

예를 들어 주시겠습니까? 내가 컴파일 할 수있는 코드 조각. 감사! – zhen

+0

이전 질문과 다른 점은 무엇입니까? http://stackoverflow.com/questions/2212506/how-do-you-use-a-void-pointer-to-generate-2d-dynamic-array – interjay

답변

0

, 나는 걸릴하려는 접근 방식은 그럼 난 배열에 액세스 할 수있는 템플릿 클래스를 만들 것

new unsigned char[<max size in bytes>] 

를 사용하여 메모리를 할당하는 것입니다. 당신은 단순히 m_array에 액세스하려는 게터/setter 메소드의 당신의 템플릿 구현에

template<class ElementType, int numBytes> 
class DynamicArray 
{ 
public: 
    DynamicArray(unsigned char* buffer); 
    ElementType& Get(long index); 
    void Set(long index, const ElementType &element); 
private: 
    ElementType* m_array; 
}; 

:처럼 뭔가. sizeof (ElementType)를 곱한 다음 numBytes보다 작은 지 확인하여 인덱스가 유효한지 확인합니다.

생성자는 단순히 버퍼를 ElementType *으로 캐스팅하여 m_array에 할당합니다.

당신은 다음 바이트를 사용하여 배열을 할당하고 thusly 히 다른 형식에 액세스 할 수 있습니다 :이 방법으로 그것을 할 것

unsigned char* buffer = new unsigned char(1000); 
DynamicArray<long, 1000> longArray(buffer); 
long val = 10; 
longArray.Set(0, val); 
longArray.Get(0); 

DynamicArray<short, 1000> shortArray(buffer); 
short firstTwoBytes = shortArray.Get(0); 
etc. 

이유는 당신에게 최대 컴파일 타임 타입 안전성을 제공한다는 것입니다. 이것이 C++ 템플릿이 실제로 잘하는 한 가지입니다. 위의 코드에서 설명한 것처럼이 템플리트 클래스의 여러 인스턴스에 동일한 버퍼를 사용할 수 있습니다. 컴파일을 시도하지 않았으므로 구문 오류가 있으면 사과드립니다.

그런데 연산자 오버로드를 사용하면 배열 접근자가 'C'배열처럼 보이게 할 수 있습니다. 예제는 STL의 "vector"클래스를 참조하십시오.

+0

그게 좋습니다! 당신의 설명에 감사드립니다! – zhen

2

배열 참조는 매우 간단합니다.

해당 B 어레이 (시작 어드레스)의 기본 주소라고하자, S는 요소의 크기이고, I0는 배열에 대한 인덱스이다.

B + (S * I0) 

당신이 여러 크기로 확장 할 수 있지만, 지금은 배열의 다른 크기를 알 필요가 : 한 차원 배열의 경우

, 요소의 주소입니다. 만약 치수 D1, D0있는 2 개 차원 배열을 갖고 있다고 할 수 있으며 I0와 indices, I1은 요소의 주소 :

B + (D1 * I1 * S) + (S * I0) 

3 개 차원 배열 등

B + (D2 * I2) * (D1 * I1 * S) + (S * I0) 

될 것이다. INT의 2 개 차원 배열에 대한 무효 포인터의 경우

, : 그 포인터 연산이를 sizeof에서 수행 될 수 있도록 * 숯불하는 무효 포인터를 캐스팅했다

int D1 = 10, D0 = 20, I1 = 5, I0 = 5; 
void * base; 

base = malloc((D1 * D0) * sizeof(int)); 
int value = *((char*)base + (D1 * I1 * sizeof(int)) + (sizeof(int) * I0)); 

주() 단위.

비록 이것이 일반적 일지 모르지만 나는 그것을 많이 사용하지 않을 것이라고 생각합니다 ;-) 배열 인덱싱이 어떻게 작동하는지 이해하는 데 도움이됩니다.

관련 문제