2016-08-14 11 views
0

これはちょっと基本的なことだとわかっていますが、私はこれに固執しています。 私はスドクゲームを作ろうとしてきました。議論はそれらを主に渡すことによって与えられるでしょう。 ** 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でデバッグすると、次のメッセージが表示されます。

あなたのコマンドラインパラメータが+あたり9つの文字のセットにおけるマーカーの数字の配列である(そして、あなたはこれらの9まで持っている)ことを前提に行く
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の配列へのポインタを使用する場合は、適切なポインタ型を使用してそれを反映させます。あなたはその尖った-するタイプの9要素のシーケンスを割り当てるために、あなたの関数を作ることができることを利用し

int (*ptr)[9]; 

:このようなポインタはこのようになります

​​はテーブル寸法あなたです
int (*arr)[DIM] = calloc(DIM, sizeof *arr); 

この場合は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

関連する問題