2016-08-14 2 views
0

이 문제는 근본적인 문제임을 알고 있습니다. 나는 스도쿠 게임을 만들려고 노력 해왔다. 인수는 주 (main)에 전달함으로써 주어집니다. ** argv보다 다른 배열에 쓰기를 시도 할 때 정수 변수를 증가시킬 때 세그먼트 오류가 발생합니다.주에게 인수를 전달할 때 분할 오류가 발생했습니다.

int **ft_copy_sudoku(int argc, char **argv) 
{ 
    int **sudoku_arr; 
    int index; 
    int s_index; 
    int j; 

    printf("%d", argc); 
    sudoku_arr = (int **)malloc(sizeof(int) * 9 * 9); 
    index = 1; 
    while (index < argc) 
    { 
     j = 0; 
     s_index = 0; 
     //sudoku_array[s_index] = (int *)malloc(sizeof(int) * 9); 
     while (j < 9) 
     { 
      if (argv[index][j] >= '1' && argv[index][j] <= '9') 
       sudoku_arr[s_index][j] = argv[index][j] - '0'; 
      else 
       argv[index][j] = 0; 
      j++; 
      s_index++; 
     } 
     index++; 
    } 
    return sudoku_arr; 
} 
void ft_print_sudoku(int **sudoku) 
{ 
    int i; 
    int j; 

    i = 0; 
    while (i < 9) 
    { 
     j = 0; 
     while (j < 9) 
     { 
      printf("%d ", sudoku[i][j]); 
      j++; 
     } 
     i++; 
     printf("\n"); 
    } 
} 
int main(int argc, char **argv) 
{ 
    ft_print_sudoku(ft_copy_sudoku(argc, argv)); 
    return (0); 
} 

gdb로 디버깅 할 때 다음 메시지가 나타납니다. 당신의 동적 테이블을 할당하려는 나타납니다 명령 줄 매개 변수가 자리 당 구 개 문자 세트에 + 마커의 시퀀스는 (그리고 당신이 이들의 구에있는) 가정에가는

Program terminated with signal SIGSEGV, Segmentation fault. 
#0 0x000000000004007a6 in ft_print_sudoku (sudoku=0x1060420) at puzzle.c:62 
62 j++; 
+0

그리고'puzzle.c : 62'는 무엇입니까? – alk

+0

내 게시물의 마지막 줄이었습니다. j ++; 그 중 하나를 제거했는데 문제가되는 줄은 39 번째 것입니다. sudoku_arr [s_index] [j] = argv [index] [j]; – Cornul11

+0

디버거는 오류가 발생한 행뿐만 아니라 그 이상을 알릴 수있을뿐만 아니라 프로그램이 충돌 할 때 정확히 알 수 있도록 모든 변수 (예 :'j')의 내용을 인쇄 할 수 있습니다. –

답변

1

9x9 int 해당 숫자를 저장할 값입니다.

마지막으로 게시 된 코드가 잘못된 간접 참조를 사용하고 있습니다. int**을 선언하고 malloc(9*9*sizeof(int))으로 설정 한 다음 포인터 배열로 처리합니다.이 포인터는 이 아니며이 아닙니다.

9- int의 배열에 대한 포인터를 사용하려면 적절한 포인터 - 유형을 사용하십시오. 이러한 포인터는 다음과 같습니다 : 그 사용

int (*ptr)[9]; 

, 당신의 9 요소의 순서를 할당하는 함수를 정교하게 할 수있는 뾰족한-하기 입력 :

int (*arr)[DIM] = calloc(DIM, sizeof *arr); 

DIM 테이블의 크기는이다 컴파일 할 때 알려진,이 경우에는 9입니다. 마지막으로 이상한 점은 여러 가지 방법으로 수행 할 수있는 기능에서 함수를 반환하는 방법입니다. 자주 사용 구를 구비하지만 한 가지 방법은 다음과 같다 :

int (*ft_copy_sudoku(int argc, char **argv))[DIM] 
{ 
    int (*arr)[DIM] = calloc(DIM, sizeof *arr); 

    .... code .... 

    return arr; 
} 

다른 틀림 명확 방법에 대한 typedef 사용 포인터 - 어레이 오브 DIM-INT :

typedef int (*row_ptr)[DIM]; 

row_ptr ft_copy_sudoku(int argc, char **argv) 
{ 
    row_ptr arr = calloc(DIM, sizeof *arr); 

    .... code .... 

    return arr; 
} 

그 모두 촬영

함께 퍼팅은, 그 결과는 다음과 같은 :

#include <stdio.h> 
#include <stdlib.h> 

#define DIM 9 

int (*ft_copy_sudoku(int argc, char **argv))[DIM] 
{ 
    int (*arr)[DIM] = calloc(DIM, sizeof *arr); 
    int ridx, cidx; 

    for (ridx=1; ridx < argc && ridx <= DIM; ++ridx) 
    { 
     char *row = argv[ridx]; 
     for (cidx=0; *row && cidx < DIM; ++cidx, ++row) 
     { 
      if (*row >= '1' && *row <= '9') 
       arr[ridx-1][cidx] = *row - '0'; 
     } 
    } 
    return arr; 
} 


void ft_print_sudoku(int (* const arr)[DIM]) 
{ 
    int i,j; 
    for (i=0; i<DIM; ++i) 
    { 
     for (j=0; j<DIM; ++j) 
      printf("%d ", arr[i][j]); 
     putc('\n', stdout); 
    } 
} 


int main(int argc, char *argv[]) 
{ 
    int (*sudoku)[DIM] = ft_copy_sudoku(argc, argv); 
    ft_print_sudoku(sudoku); 
    free(sudoku); 
    return 0; 
} 

숫자와 마커의 9 개 명령 줄 인수가 can be seen here 인 스택의 예입니다. 인수와 인쇄 출력이있는 예제 명령 줄은 다음과 같습니다.

./a.out 123-567-9 234-67891 3-5678-1- ---789123 5-7-9-2-4 67-9123-5 78-12345- 8-123-567 -1-3-5-7- 

1 2 3 0 5 6 7 0 9 
2 3 4 0 6 7 8 9 1 
3 0 5 6 7 8 0 1 0 
0 0 0 7 8 9 1 2 3 
5 0 7 0 9 0 2 0 4 
6 7 0 9 1 2 3 0 5 
7 8 0 1 2 3 4 5 0 
8 0 1 2 3 0 5 6 7 
0 1 0 3 0 5 0 7 0 
+0

오류를 지적 해 주셔서 감사합니다. 귀하의 도움을 많이 주시면 감사하겠습니다. – Cornul11

관련 문제