0

저는 C++을 처음 사용하고 이중 포인터를 사용하여 다차원 배열의 코드를 작성하려고합니다.값을 할당하려고 할 때 C++ 코드가 끊어짐

클래스 선언 :

class magicMat{ 

    private: 
     int** ptrnum; 

    public: 
     void init(int); 
     void Display(int); 
     void set(int); 
     void message(); 
     void errorhandling(int);  
}; 

기능 정의 : 이것은 내 코드입니다

void magicMat::init(int input) 
{  
    ptrnum=new int*[input]; 

    for (int row=0;row<input;row++) 
     ptrnum[row]=new int[input]; 

    for(int x=0;x<input;x++) 
    { 
     for (int y=0;y<input;y++) 
     { 
      *(ptrnum[x]+y)=0; 
     } 
    } 
} 

void magicMat::set(int input) 
{ 
    int row=1,col=input/2,otherdiag=0; 

    for(int value=1;value<=input*input;value++) 
    { 
     if (*(ptrnum[row]+col)>0) 
     { 
      row=row+2; 
      if(row>input) 
       row=row-input; 

      col--; 
      if(col<1) 
       col=input; 
     } 
     *(ptrnum[row]+col)+=value; 
     *(ptrnum[0]+col)+=value; 
     *(ptrnum[row]+0)+=value; 

     if (row==col) 
      *(ptrnum[0]+0)+=value;   

     if (row+col==input+1) 
      otherdiag+=value;     
/*                  */ 
/*  Determine where new row and col are        */ 
/*                  */ 
     row--; 
     if (row < 1)      /* If row exceeds side then */ 
      row = input;     /* goto other side.   */ 
     col++; 
     if (col > input)     /* If col exceeds side then */ 
      col = 1; 
    }  
} 

주요 기능 : set

int main() 
{ 
    int num; 
    magicMat newMat; 
    newMat.message(); 
    while(1) 
    { 
     cin>>num; 
     if (cin.good()) 
     { 
      newMat.errorhandling(num); 
     } 
     else if (!isdigit(num)) 
     { 
      cout<<"Please enter only digits"<<endl; 
     }  
     newMat.init(num); 
     newMat.set(num); 
     newMat.Display(num); 
    } 
    cout<<"\nBye bye!\n"<<endl; 
    return 0; 
} 

그것은 init 기능에서 작동하지만 때 함수 내가 처음에 깨뜨린 값을 확인하려고 노력한다. 데이터 함수에있는 set

+2

'ptrnum [x] [y]'만 시도해보십시오. 하지 않을 진짜 이유가 없다면 대신 벡터 벡터를 사용하십시오. 훨씬 더 안전합니다. '> 행렬; – chris

+0

글쎄 이중 포인터를 사용하라는 요청을 받았습니다. 숙제입니다. 죄송합니다. HW로 태그를 지정하지 않았습니다. 지금 작성하십시오. – SB26

+1

덧붙여 말하자면 "init"함수를 사용하는 것은 일반적으로 C++. 객체는 생성자를 통해 초기화되어야합니다. 이렇게하면 실수로 초기화하는 것을 잊을 수 없습니다. http://en.wikipedia.org/wiki/Constructor_(object-oriented_programming) – HostileFork

답변

0

귀하는 귀하의 배열 경계를 벗어나고 있습니다. 그냥 예를 들어, 당신의 코드를 실행하고 set 함수의 끝 부분에이 라인을 보려면, 5-input의 값을 설정 내 첫 번째 자리 5를 입력하면 다음의 끝에서

row--; 
if (row < 1) 
    row = input; 

처음에는 set 함수의 루프를 통해이 줄 바로 앞에 row1과 같습니다. 이 세 줄이 실행되고 결과적으로 row5과 동일하게 설정됩니다. set에서 다음 루프의 시작 부분에서

, 당신은이 작업을 수행 :

if (*(ptrnum[row]+col)>0) 

문제는 ptrnum이 유효 인덱스는 0-4에서 의미 5 × 5 배열 것입니다. 그러나 이전 루프가 끝날 때 row5으로 설정하면 ptrnum 범위를 벗어나는 색인이 생성되어 프로그램이 중단됩니다.

디버거에서 코드를 단계적으로 실행하거나 코드를 수행하는 방법을 잘 모르는 경우 코드가 인 변수에 적어도 cout 문을 넣으면 변수가 설정되는지 확인할 수 있습니다. 당신이 생각하는 것에 맞춰야합니다.

행운을 빈다.

관련 문제