2014-12-16 2 views
1

동적으로 할당 된 메모리를 사용하여 2 차원 배열을 만들 필요가 있습니다. 두 차원 모두 런타임에 설정됩니다.하지만 효율성을 높이기 위해 다음과 함께 한 차원 버전을 만들려고합니다. 인접한 할당 된 메모리, 그리고 다시는 어떻게 든 2 차원 배열로 사용하려고합니다. 이것을 구현하기 위해 캐스팅을 사용하는 방법이 있습니까? 구현하고자하는 용도는 다음과 같습니다. 명확하게 작동하지 않습니다. 이 이후 베스트,C++에서 1 차원 배열을 2 차원 배열로 캐스팅

int size = 4; 
int* arr = new int[size]; 
arr[0] = 10; 
arr[1] = 11; 
arr[2] = 12; 
arr[3] = 13; 
cout << (int[][2])arr[1][1] << endl; 
+0

왜 메모리를 명시 적으로 관리 하시겠습니까? 누드 배열을 사용하는 것은 C++ 관용적이지 않습니다. 귀하의 경우에 대한 boost :: multidim 것입니다 (비록 내가 많은 사람들이 부스트에 싫은 내색, 다양한 이유로 알고). http://www.boost.org/doc/libs/1_57_0/libs/multi_array/doc/user.html – datenwolf

답변

2

Codor의 솔루션이 C++의 코딩 스타일을 가장 잘 준수한다고 생각하지만 C 언어로 된 솔루션을 공유하고 싶습니다.

#include <iostream> 

typedef int (*pint2)[2]; //pint2 is a pointer to an array of 2 ints 

int main() 
{ 
    int arr[4] = { 0, 1, 2, 3 }; 
    pint2 parr = (pint2)arr; 
    std::cout << parr[0][0] << std::endl; 
    std::cout << parr[0][1] << std::endl; 
    std::cout << parr[1][0] << std::endl; 
    std::cout << parr[1][1] << std::endl; 

    getchar(); 
    return 0; 
} 

희망이 있습니다. (또는 적어도 당신이 흥미있는 것을 발견했다 : /)

편집 : 가변 길이의 배열에 대해서!

#include <iostream> 

int main() 
{ 
    int arr[12] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; 
    const int sizeofarr = sizeof(arr)/sizeof(arr[0]); //Number of elements in array 

    { 
     const int numofrows = 2; //Number of rows 
     const int numofcolumns = sizeofarr/numofrows; //Number of columns 
     typedef int (*pinta)[sizeofarr/numofrows]; //A 2D array of columns of 2 

     pinta parr = (pinta)arr; 
     for(int i = 0; i < numofrows; ++i) 
      for(int j = 0; j < numofcolumns; ++j) 
       std::cout << parr[i][j] << std::endl; 
    } 

    { 
     const int numofrows = 3; //Number of rows 
     const int numofcolumns = sizeofarr/numofrows; //Number of columns 
     typedef int (*pinta)[sizeofarr/numofrows]; //A 2D array of columns of 3 

     pinta parr = (pinta)arr; 
     for(int i = 0; i < numofrows; ++i) 
      for(int j = 0; j < numofcolumns; ++j) 
       std::cout << parr[i][j] << std::endl; 
    } 

    getchar(); 
    return 0; 
} 
+0

Nard, 어떤 치수도 컴파일 타임에 알려지지 않으므로 typedef int (* pint2) [2]를 사용할 수 없습니다. 그러나 흥미 롭습니다. – Efe

+0

@ Efe 원하는대로 편집되었습니다. : D – Nard

+0

평소처럼 평 균적이어야합니다. – Nard

2

당신 (인해 지방 요구하는 것이 필요하다)이 1 차원 배열을 마무리 할 수 ​​과부하 operator() 일부 적합한 지표 계산을 이용하여 이차원 acccess을 허용하도록, C++이다.

+0

그래서 내장형 캐스팅을 사용하는 해결책이없는 것 같습니다. 나는 오버로딩 방법을 고려해야한다. – Efe

0

그램은 ++ -fpermissive 다음과 같은 약간 변경 라인 (연산자 우선 순위) 컴파일 :

cout << ((int[][2])arr)[1][1] << endl; 

나는 그것이 가정을 UB (? 사람) 그러나 나는 또한 잘 모든 "일반적인 작동한다고 가정 "플랫폼.

+0

여하튼 그것은 osx에서하지 않았다. – Efe

+0

g ++ (GCC) 4.8.3 대상 : i686-pc-cygwin; 또한 '수감'이 필요했다. 하지만 나드의 캐스팅이 훨씬 더 나은 것으로 나타났습니다. 그것은 사람이해야 할 일입니다 (만약 그것을하고 싶다면). –

+0

오. 컴파일되었지만 추락했다는 뜻입니까? –

관련 문제