数独生成器导致分段错误

时间:2015-08-22 23:01:34

标签: c segmentation-fault sudoku

我正在尝试在C中创建一个生成随机数据的程序。它会生成随机数,并检查行中或列中或方块3x3中是否有相同的数字,如果没有,则将其放入单元格e进入下一个。唯一的问题是第5行,当索引为6时,它会产生分段错误。如果我在程序中注释时更改,则会循环播放。有什么问题?

include <string.h>
#include <stdlib.h>
#include "sudoku.h"
#include <stdio.h>
#include <time.h>

int dimension = 9;

int main(int argc, char** argv){
  int dimension = 9;
  int j ,k ;
  int ** sudo =  malloc(sizeof(*sudo)*dimension);
  for ( j = 0; j< dimension; j++){
    sudo[j] = malloc(sizeof(int)*dimension);
    for ( k = 0; k<dimension; k++){
      sudo[j][k] =0;

    }
  }
  riempiSudoku(sudo);
  return 0;


}

void riempiSudoku(int** sudo){  //fill sudoku
  int i,j;
  srand ( time(NULL));
  srand(rand());
  for (i=0;i<dimension;i++){
    for(j=0;j<dimension;j++){
      int ran;
      do
    ran= rand() %9 ;
      while(checkSquare(sudo,i,j,ran+1)||checkRow(sudo,i,ran+1)
        ||checkCol(sudo,j,ran+1));
      sudo[i][j] = ran+1;
      printf("%d", sudo[i][j]);
    }
    printf("\n");
  }
}


int checkRow(int** sudo, int row, int value){ //check if the number is in the row
  int i;
  for (i = 0; i<dimension; i++){
    if (sudo[row][i] == value)
      return 1;
  }
  return 0;
}

int checkCol(int** sudo, int col, int value){//check if the number is in the col
  int i;
  for (i = 0; i<dimension; i++){
    if (sudo[i][col] == value)
      return 1;
  }
  return 0;

}

int checkSquare(int** sudo, int row, int col, int value){ //check if the number is in the square 3x3
  int i,j;
  if (row==0||row==2||row==1){
    if(col==0||col==1||col==2){
      for(i=0;i<3;i++){
    for(j=0;j<3;j++){
      if (sudo[i][j] == value)
        return 1;
    }
      }
      return 0;
    }
    if(col==3||col==4||col==5){
      for(i=0;i<3;i++){
    for(j=3;j<6;j++){
      if (sudo[i][j] == value)
        return 1;
    }
      }
      return 0;
    }
    if(col==6||col==7||col==8){
      for(i=0;i<3;i++){
    for(j=6;j<9;j++){
      if (sudo[i][j] == value)
        return 1;
    }
      }
      return 0;
    }
  }
  if (row==3||row==4||row==5){
    if(col==0||col==1||col==2){
      for(i=3;i<6;i++){
    for(j=0;j<3;j++){
      if (sudo[i][j] == value)
        return 1;
    }
      }
      return 0;
    }
    if(col==3||col==4||col==5){
      for(i=3;i<6;i++){
    for(j=3;j<6;j++){
      if (sudo[i][j] == value)
        return 1;
    }
      }
      return 0;
    }
    if(col==6||col==7||col==8){
      for(i=3;i<6;i++){
    for(j=6;j<9;j++){
      if (sudo[i][j] == value)
        return 1;
    }
      }
      return 0;
    }
  }
  if (row==6||row==7||row==8){
    if(col==0||col==1||col==2){
      for(i=6;i<9;i++){
    for(j=0;j<3;j++){
      if (sudo[i][j] == value)
        return 1;
    }
      }
      return 0;
    }
    if(col==3||col==4||col==5){
      for(i=6;i<9;i++){
    for(j=3;j<6;j++){
      if (sudo[i][j] == value)
        return 1;
    }
      }
      return 0;
    }
    if(col==6||col==7||col==8){
      for(i=6;i<9;i++){
    for(j=6;j<9;j++){
      if (sudo[i][j] == value)
        return 1;
    }
      }
      return 0;
    }
  }


}

1 个答案:

答案 0 :(得分:1)

In C, it is not correct to cast the return of [m][c][re]alloc()
C99 (或我所知道的任何其他C版本)不需要演员。 C隐式转换为void *和来自void *。演员然后自动完成 另一方面, C ++ 需要演员,因为它只会将转换为 int ** sudo = (int**) malloc(sizeof(int)*dimension); for ( j = 0; j< dimension; j++){ sudo[j] = (int*) malloc(sizeof(int)*dimension); ,而不是来自的

对于初学者,然后更改代码的这一部分:

 int ** sudo = malloc(sizeof(*sudo)*dimension);
  for ( j = 0; j< dimension; j++){
    sudo[j] = malloc(sizeof(int)*dimension);  

致:

sizeof(*sudo)

注意:对于第一个malloc,指针空间所需的内存大小非常依赖于目标可执行文件,即32或64位,但在这种情况下def generate_sample(self, ob, preview): print("* Generating sample...") tone_out = array(ob, dtype=int16) if preview: print("* Previewing audio file...") bytestream = tone_out.tobytes() pya = pyaudio.PyAudio() stream = pya.open(format=pya.get_format_from_width(width=2), channels=1, rate=OUTPUT_SAMPLE_RATE, output=True) stream.write(bytestream) stream.stop_stream() stream.close() pya.terminate() print("* Preview completed!") else: write('sound.wav', SAMPLE_RATE, tone_out) print("* Wrote audio file!") 将适用于任何一个。