2012-03-21 1 views
2

가변 크기로 동적으로 할당 된 양방향 배열을 만들려고하는데 왜 내 자신의 상수 값을 만들면 컴파일되지 않는지 알 수 없습니다.C++에서 클래스의 메서드에서 동적으로 할당 된 행렬을 전송

const int oConstanta=N+1; 

    int (*m)[oConstanta]=new int[oConstanta][oConstanta]; 

그러나 대괄호 사이에 1000과 같은 일반 상수를 사용하면 성공적으로 컴파일됩니다.

const int oConstanta=N+1; 

    int (*m)[1000]=new int[1000][1000]; 

아무도 이유를 알고 있습니까?

추신 :

int **m=new int*[oConstanta]; 

    for(i=1;i<=N;i++) 
    { 
     m[i]=new int[oConstanta]; 
     init(m[i]); 
    } 

내 문제를 해결하지만 내 전자의 방법은 좋은 생각이 왜 배우고 싶어요 : 나는 것을 알고있다.

+0

첫 번째 것은 표준 C++가 아닙니다. –

+1

'N'은 무엇입니까? @smarinov : 'N'에 따라 네, 그렇습니다. –

+1

포인터를 사용하지 마십시오.대신에'std :: vector >'을 사용하고, 래퍼 클래스'Matrix'를 쓰는 것이 바람직합니다. –

답변

1

N이 컴파일 타임 상수식이 아닌 한 oConstanta은 컴파일시 상수가 아닙니다.

++ C에서 2 차원 배열을 만드는 가장 좋은 방법은 다음과 같은 예를 들어, std::vectorstd::vector의의를 사용하고 있습니다 :

#include <vector> 

std::vector<std::vector<int> > m(N+1, std::vector<int>(N+1, 0)); 
0

궁극적 이유는 당신이 변수의 정적 배열을 생성 할 수 있다는 것입니다 길이.

코드에서 가변 길이의 동적 배열의 정적 배열을 만들려고합니다.

정적 배열은 스택에 있고 동적 배열은 힙에 있습니다. 힙의 메모리 관리는 "유연"하지만 스택은 다릅니다. 컴파일러는 스택의 각 프레임 크기를 결정할 수 있어야합니다. 가변 길이의 배열을 사용하면 이것은 분명히 불가능합니다. 반면에 포인터를 사용하면 스택 프레임의 크기를 알 수 있습니다 (포인터의 크기가 알려져 있음). 모든 것이 정상입니다. 당신이 시도 할 경우는 그 항목을 동적으로 가변 길이의 배열을 할당 고정 된 크기의 정적 배열 (수) 이후,이

int (*m)[1000]=new int[oConstanta][1000] 

잘 컴파일해야

.

간단히 말해서 : 컴파일 타임에 객체의 크기를 알 수 없을 때마다 그 객체는 스택에있을 수 없으며, 동적으로 할당되어야합니다.

std::vector<int> matrix(Rows*Columns); 

액세스 I 행째 J 번째 열의 원소 :

matrix[Columns*i + j] = 1; 
0

는 인접 요소 단일 할당을 동적으로 사이즈의 2 차원 행렬을하려면

이 모든 것을 클래스로 래핑 할 수 있습니다. 다음은 매우 기본적인 예입니다.

관련 문제