2017-05-14 1 views
0

이 할당은 동적으로 할당 된 매트릭스를 선언하고 사용해야 할 곳입니다. 알려진 데이터가있는 7X7 그리드로 초기화되었습니다. (아래 참조)동적으로 할당 된 매트릭스는 포인터에 대한 포인터를 얻지 못합니다.

적어도 천 가지 방법을 시도했지만 컴파일러가 가져올 수 없을 때마다 캐스팅 int []와 관련된 문제를 경고합니다. []에서 int **. 코드 스크린 샷을 추가하고 도움을받을 것입니다!

#include <cstdlib> 
#include "Map.h" 
typedef int size_type; 
typedef int** grid_type; 
grid_type ppGrid; 
size_type size_h; 
size_type size_w; 

int mapInitializer[7][7]= 
     { 
     { 0 , 1 , 1 , 1 , 1 , 1 , 1}, 
     { 1 , 2 , 2 , 0 , 1 , 0 , 1}, 
     { 0 , 0 , 1 , 1 , 1 , 2 , 1}, 
     { 1 , 0 , 0 , 0 , 0 , 0 , 1}, 
     { 1 , 1 , 1 , 2 , 1 , 0 , 1}, 
     { 1 , 0 , 0 , 0 , 0 , 2 , 1}, 
     { 1 , 0 , 1 , 1 , 1 , 1 , 1} 
     } ; 

Map::Map(){ 
    grid_type ppGrid; 
    realloc(ppGrid,7); 
    for(int i=0;i<7;i++){ 
     realloc(ppGrid[i],7); 
    } 
    ppGrid=mapInitializer; 
} 
+0

[2 차원 배열은 이중 포인터입니까?] http://stackoverflow.com/questions/7586702/is-2d- array-a-double-pointer) – CIsForCookies

+3

(1) ** 포인터 타입이라면 ** typedef 뒤에 포인터 타입을 숨기지 마라. 그것은 포인터로 가능한 가장 오류가 발생하기 쉬운 방법입니다. (2) 이중 포인터는 2 차원 배열이 아니므로 이중 포인터에 2 차원 배열 유형의 변수를 할당 할 수는 없습니다. 이들은 호환되지 않는 유형입니다. (3) 직접 메모리를 관리하는 것이 아니라'std :: vector > '을 사용하십시오. (4) 한 번에 하나씩 * 행을 복사하십시오. (5) 다음 번 게시물 코드는 텍스트가 아닌 이미지입니다. 이미지를 컴파일러로 복사하여 코드를 검사 할 수는 없습니다. – StoryTeller

+0

@StoryTeller 안녕하세요, thx! 이미지가 아닌 실제 코드로 게시물을 업데이트했습니다. 슬프게도 typedef를 사용해야하고 벡터를 사용할 수 없습니다. 내가 할 수 있으면 좋겠어. 동적으로 할당 된 행렬로 모든 일이 이루어져야합니다. –

답변

1

int**은 포인터 위의 포인터를 의미합니다. 2 차원 매트릭스는 메모리에 직접 위치한다 (즉, memroy의 현재 행 다음에 배치 된 다음 행). 따라서이 포인터를 역 참조하려고하면 포인터가 아니라 값을 갖게됩니다. 행별로 행렬을 복사하거나 배열 전체에 하나의 메모리를 할당해야합니다.

+0

전체 배열에 대해 하나의 메모리를 할당하려했으나 이후에 ppGrid를 수용 할 수있는 방법을 찾지 못했습니다. 내가 무엇을해도 int **와 int [] [] 사이의 비교를 허용하지 않을 것입니다. –

0

포인터가 배열과 같지 않습니다. 배열은 컴파일러에서 모든 요소를 ​​할당하고 컴파일 시간에 크기를 알 수 있습니다 (정적 크기). 포인터는 주소이고 [] 연산자를 사용하면 을 참조 취소 할 수 있습니다. 마치 배열 인 것처럼 보이지만 실제로는 그렇지 않습니다. 배열 이름이 첫 번째 요소에 대한 포인터로 동작한다는 사실 때문에 초보자는 동일한 요소라는 것을 추측 할 수 있습니다.

배열과 포인터는 없습니다 double matrix[7][7]; 같은 같은 일 뭔가 double **matrix;double *matrix[7]; 완전히 다르다. 첫 번째 배열은 일곱 개의 배열이 배열 된 double이고, 두 번째 배열은 double에 대한 포인터이고 세 번째 배열은 일곱 개의 포인터 배열 double입니다.

포인터 산술을 사용하면 포인터를 배열을 반복하는 위치와 같이 이동할 수 있습니다. 그러나 포인터가 산술적으로 동일한 것은 아닙니다. 포인터는 이동할 수 있지만 배열을 이동할 수는 없습니다. 당신이 사람들을 sizeof을 얻기 위해 시도하는 경우

마지막으로, 당신은 얻을 것이다 : 더 초보자를 방해

sizeof (double [7][7]) /* seven times the sizeof of an array of seven doubles == 49 times the sizeof a double */ 
sizeof (double *[7]) /* seven times the sizeof an array of seven pointers to double == 7 times the size of a pointer */ 
sizeof (double **) /* the sizeof a pointer to pointer to double == the size of a pointer */ 

뭔가 컴파일러는 항상 C 함수 형식 매개 변수에 포인터로 배열 참조로 변환한다는 사실이기 때문에, 지정되지 않은 2 차원 배열을 의미하는 double param_matrix[][]을 보면 컴파일러는 실제로 해당 매개 변수를 double **param_matrix으로 변경합니다 (그리고 2 차원 배열로도 동작하지 않습니다)

관련 문제