2012-05-11 6 views
1

내가이 비슷한 클래스를 가지고 :C++ - 방법 인수로 2 차원 배열

class Krzyzowka 
{ 
    protected: 
    char model[40][40]; 
    int x, y; 

    public: 
     Krzyzowka() { } 

      Krzyzowka(char model[][40], int x, int y) 
      { 
       this->model=model; 
      } 
}; 

을 지금, 나는) (주에서 선언

char array[10][10]; 

과에 전달하려는 :

Krzyzowka obj(array, 10, 10); 
0,123,516 :

Krzyzowka(char model[][40], int x, int y) 

것은 나는 이런 식으로하고 있어요

그러나 나는 전달 된 배열 모델 2 차원 배열을 설정하려면 :

this->model=model; 

을하지만 컴파일러는 두 가지 오류 반환 :

error: no matching function for call to ‘Krzyzowka::Krzyzowka(char [10][10], int, int)’ 

error: incompatible types in assignment of ‘char (*)[40]’ to ‘char [40][40]’ 

어떻게 올바르게 수행 할 수 있습니까? 도움에 미리 감사드립니다.

+0

뭐라 구요? [10] [10] 배열을 [40] [40] 배열로 올바르게 전달 하시겠습니까? –

+0

'Krzyzowka'는 크로스 워드 퍼즐이므로'std :: vector '을 사용하지 않으시겠습니까? –

답변

0

배열을 다른 배열에 자동으로 할당하는 작업을 수행 할 수 없습니다. 마음에 와서

가능한 해결 방법 :


수동 (유효 nrowsncols를 추적 할 수 있는지 확인) 루프를 사용하여 내부 배열에 데이터를 복사 할당합니다. 컴파일러 불만을 우회 위해 당신은 (크기를 가정하면 컴파일 타임에 알려져있다) 템플릿을 사용할 수 있습니다

char array[][2] = {{'a', 'b'}, {'c', 'd'}}; 
Krzyzowka k(array); 

의 치수 경우 :

template<int NROWS, int NCOLS> 
    Krzyzowka(char (&model)[NROWS][NCOLS]) 
    { 
     nrows = NROWS > nrows ? nrows : NROWS; 
     ncols = NCOLS > ncols ? ncols : NCOLS; 
     for (int row = 0; row < nrows; row++) 
      for (int col = 0; col < ncols; col++) 
      this->model[row][col] = model[row][col]; 
    } 

지금 당신이 좋아하는 개체를 만들 수 있습니다 배열은 런타임에만 알려지고 (예 : 사용자 입력을 기반으로하고 char** array은 중첩 된 new[]에 의해 동적으로 할당됩니다.) given here 접근 방식을 채택하거나 다음으로 전환해야 할 수 있습니다.


더 나은 아마 (당신이 교체하거나 할당 할 수있는) std::vector과 같은 몇 가지 표준 배열 형식을 사용하는 것입니다. 그렇다면 컴파일러 유형 비호 환성 문제에도 문제가 없습니다.

std::vector<std::vector<char> > array(nrows, std::vector<char>(ncols)); 
std::vector<std::vector<char> > model; 
model = array; // or model.swap(array); if you don't need the copy 
+0

모델에 char 배열을 사용하고 싶습니다. 내가 사용하는 경우 : 문자 배열 [nrows] [ncols]; char ** model; model = array; 내 생성자 프로토 타입은 무엇이되어야합니까? –

2

매개 변수 char model[][40]parameter[x][40] 같은 배열에 사용될 수 있습니다. 대신 char array[x][y]를 사용하는 객체를 인스턴스화

class Krzyzowka 
{ 
    protected: 
     char **pp_model; 
     int x, y; 

    public: 
     Krzyzowka() { } 

     Krzyzowka(char **pp_model, int x, int y) 
     { 
      this->pp_model = pp_model; 

      // do not miss follow two line 
      this->x = x; 
      this->y = y; 
     } 
}; 

그런 다음 char ** 매개 변수를 전달할 수 : 당신이 정말로 방법에 대한 행 배열을 전달하려면

, 당신은 포인터를 사용할 수 있습니다.

이제는 c++을 사용했습니다. 행 배열을 사용하지 않는 것이 좋습니다. 그게 evil입니다. 대신 stl vector를 사용할 수 있습니다.

도움이 될 수 있습니다.