2010-04-01 2 views
0

긴 밤 있었지만이 붙어 지금 내 컴파일러에서 "분할 오류".. 기본적으로 표시 여러 오류

나는 모든 오류를 표시하기 위해 노력하고있어

합니다 (COUT)를 얻고 필요합니다. 둘 이상의 오류가있는 경우 모두 표시해야합니다.

bool validMove(const Square board[BOARD_SIZE][BOARD_SIZE], 
       int x, int y, int value) 
{ 
    int index; 
    bool moveError = true; 
    const int row_conflict(0), column_conflict(1), grid_conflict(2);  
    int v_subgrid=x/3; 
    int h_subgrid=y/3; 

    getCoords(x,y); 

    for(index=0;index<9;index++) 
     if(board[x][index].number==value){ 
      cout<<"That value is in conflict in this row\n"; 
      moveError=false; 
      } 

    for(index=0;index<9;index++) 
     if(board[index][y].number==value){ 
      cout<<"That value is in conflict in this column\n"; 
      moveError=false;  
      } 



    for(int i=v_subgrid*3;i<(v_subgrid*3 +3);i++){ 
     for(int j=h_subgrid*3;j<(h_subgrid*3+3);j++){ 
      if(board[i][j].number==value){ 
       cout<<"That value is in conflict in this subgrid\n";    
       moveError=false; 
      }   
     } 
    } 
return true; 
} 
+0

분할 오류? 재부팅 해보십시오 *. (사과를 Dilbert에게) – EFraim

+0

@igor : KennyTM의 포맷 변경이 롤백 된 이유는 무엇입니까? 이전에 롤백 한 것을 알기 전에 가독성을 높이기 위해 동일한 변경을하려고했습니다. –

+0

모든 인덱스가 유효합니까? 여기에는 오류 검사가 없습니다. – Naveen

답변

0

색인을 확인하십시오.

for(index=0;index<9;index++) 

은 다음과 같아야합니다 :

for(index=0;index<8;index++) 

아니면 고정 된 크기의 배열을 사용되기 때문에이 후, 체스 보드 인 경우, off-by-one 오류를

0

, 당신의 세그먼트 폴트를 유발하는 정확한 라인을 찾아 (나는 당신이 GCC를 사용하고 있으리라 믿고있어) 플래그 -ggdb 컴파일 한 다음 (gdb ./name_of_the_program 사용) gdb를 사용하여 프로그램을 실행합니다. GDB가 시작될 때 run을 사용하여 프로그램을 시작하십시오. "main"에서 중단되고 continue을 실행합니다. 그것이 끝날 때까지 뛰게하십시오. segfault가 발생하면 backtrace (또는 bt)을 실행하여 프로그램 실행의 백 트레이스를 얻습니다. 백 트레이스에는 SEGFAULT를 일으킨 정확한 행이 포함되어야합니다.

GDB에서 나오는 정보로 프로그램을 디버깅 할 수 있어야합니다. 그러나 그보다 더 많은 도움이 필요하면 backtrace의 결과를 보내 주시면보다 많은 도움을 받으실 수 있습니다.

1

이 될 수 있습니다 더 나은 :

for(index=0;index<BOARD_SIZE;index++) 

명명 된 상수가 있다면 항상 마법 번호 대신 사용하십시오.

+1

나에게 스도쿠처럼 보입니다. – Potatoswatter

+1

@ Potatoswatter 당신은 맞을지 모르지만, 명명 된 상수를 사용하는 것이 가장 좋습니다. –

0

1) assert(false) 오류 메시지를 제공 있도록 디버그에있는

const Square& GetSquare(
     const Square board[BOARD_SIZE][BOARD_SIZE]&, 
     int x, 
     int y) 
    { 
     assert(x >= 0); 
     assert(x < BOARD_SIZE); 
     assert(y >= 0); 
     assert(y < BOARD_SIZE); 
     return board[x][y]; 
    } 

시험 : 직접 보드 [X] [인덱스] 등 대신이 기능을 사용합니다. assert(false)을 작성하고 메시지를 본 다음이 행을 삭제하십시오. 이러한 주장이 없다면 나는 단순히 코드를 신뢰할 수 없습니다.

2) 고려) 매직 넘버 9와 3

3를 사용하지 않는 것이 int로 v_subgrid = X/3; 예를 들어, 7/3 = 2이고 나머지는 1이다. 그리고 2/3 = 0이다. 이것이 당신이 원하는 것이라면, 좋습니다. 계정으로 가져 가세요.

0

나는 ... 당신의 SEG 값 (도합니다 (proir 두-루프) 대신 BOARD_SIZE의 9를 사용하여 위에서 언급 한 바와 같이) ... 다음 절에있을 수 있습니다

for(int i=v_subgrid*3;i<(v_subgrid*3 +3);i++){ 
    for(int j=h_subgrid*3;j<(h_subgrid*3+3);j++){ 
     if(board[i][j].number==value){ 
      cout<<"That value is in conflict in this subgrid\n";    
      moveError=false; 
     }    
    } 

I 기대 당신과 같은 기능을위한 강력한 테스트 (단위 테스트)를 작성하는 것이 좋습니다. BOARD_SIZE - 2 이상으로 설정된 X 또는 Y의 값을 전달하면 보드의 배열 크기를 인덱싱하는 것입니다.

내가 통해 얻을 수 있습니다 노력하고있어, 코드 정말 경계에서 인덱싱을 중지하는 자리에있을 필요가,이 또한 도움이 희망, 컴파일러,하지 프로그램에 닐