2014-02-22 6 views
1

그래서 저는 C++을 처음 접했고이 C++ 코드를 작성했습니다.C++에서 2 차원 배열 전달 및 반환

#include <iostream> 
using namespace std; 

int** mat_mult(int mat1[2][2], int mat2[2][2]){ 
    int mat3[2][2] = {{0,0},{0,0}}; 
    for(int i(0);i<2;i++){ 
     for(int j(0);j<2;j++){ 
      for(int k(0);k<2;k++){ 
       mat3[i][j] += mat1[i][k]*mat2[k][j]; 
      } 
     } 
    } 
    return mat3; 
} 

int** mat_pow(int mat[2][2], int n){ 
    int mat1[2][2] = {{1,0},{0,1}}; 
    while(n){ 
     if(n%2==1){ 
      mat1 = mat_mult(mat, mat1); 
     } 
     mat = mat_mult(mat,mat); 
     n >>= 1; 
    } 
    return mat1; 
} 

int specialFib(int n){ 
    int mat[2][2] = {{0,1},{2,1}}; 
    mat = mat_pow(mat,n); 
    return (mat[0][0]*2 + mat[0][1]); 
} 

int main(){ 
    cout << specialFib(3) << endl; 
    return 0; 
} 

그러나이 컴파일하는 날이 오류를 제공,

prog.cpp: In function 'int** mat_mult(int (*)[2], int (*)[2])': 
prog.cpp:13: error: cannot convert 'int (*)[2]' to 'int**' in return 
prog.cpp: In function 'int** mat_pow(int (*)[2], int)': 
prog.cpp:20: error: incompatible types in assignment of 'int**' to 'int [2][2]' 
prog.cpp:22: error: cannot convert 'int**' to 'int (*)[2]' in assignment 
prog.cpp:25: error: cannot convert 'int (*)[2]' to 'int**' in return 
prog.cpp: In function 'int specialFib(int)': 
prog.cpp:30: error: incompatible types in assignment of 'int**' to 'int [2][2]' 

나는 어떤 해결책을 찾기 위해 노력했지만 운. :(

답변

2
int **mat3 = {{0,0},{0,0}}; 

이 당신은 당신이 원하는 정수에 대한 포인터에 대한 포인터로 초기화 할 수 있습니다. mat3 정수에 대한 포인터에 대한 포인터를한다. 그러나 {{0,0},{0,0}} 배열이 아닌 포인터에 대한 포인터입니다 . 정수

은 아마 당신이 원하는 : 당신이 동적으로 다음 2 차원 배열을 할당 할 경우

int mat3[2][2] ... 
+0

코드 업데이트 - 일부 다른 오류 !! :(OP를 확인하십시오. – rnbcoder

+0

'mat_pow'가 돌아 오면'mat1'이 사라지기 때문에 포인터를 반환하는 것은 아무 의미가 없습니다. 포인터를 반환하려면 누가 그 포인터를 할당 할 책임이 있는지 결정해야합니다 메모리를 할당 할 책임이있다.이 경우 포인터를 반환하는 대신 호출자가 포인터를 응답하려는 곳으로 전달해야한다. (또는 이러한 C 유형 대신 실제 C++ 유형을 사용한다. .) –

1

코드가 같아야합니다 :

int** mat3 = new int*[2]; 
for(int i = 0; i < 2; ++i) 
    mat3[i] = new int[2]; 

후 해제 : 또한

for(int i = 0; i < 2; ++i) { 
    delete [] mat3[i]; 
} 
delete [] mat3; 

수동 내가 동적 배열을 사용하지 않을 것

다른 답변에서와 같이

, 그 값을 초기화해야하지만 벡터의 벡터

0

당신은 C++을 사용하여이 질문에 태그를 붙였습니다! 컴파일시 두 크기를 모두 알고있는 경우 std::array<std::array<int,Xsize>, Ysixe>>을 사용하거나 그렇지 않으면 std::vector<std::vector<int>>을 사용할 수 있습니다.

0

C++에서 배열은 매우 특별한 컬렉션 기능입니다. standard container classes에 대해 자세히 읽고 처음부터 새로운 것을 모두 써야합니다. - 저를 신뢰하십시오. 시간을 절약 할 것입니다! :)

기본 컨테이너 클래스의 객체는 기본 유형 (예 : int 또는 double)과 동일한 쉬운 방법으로 함수에서 반환 할 수 있습니다.

std::vector<std::vector<int> > GetInts() 
{ 
    // ... 
    return v; 
} 

문제가 단순히 사라집니다.

포인터 및 배열은 낮은 수준의 메모리 관리을 의미합니다. 그것은 확실히 초보자 물건이 아닙니다!