存在分段错误,但我看不到无限循环中的任何问题、内存访问问题等

问题描述 投票:0回答:1

我想制作一个程序,用蛮力生成数独 9x9 和 1-9 的固定数字数组。随机打乱数组时似乎存在分段错误,我似乎无法找到它实际在哪里。

完整代码在这里,问题出在

inputRandoms
函数中:

#include <time.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int count = 0;
int matrix[9][9] = { 0 };
void inputRow(int matrix[9][9], int suffeledArr[], int* row);
void inputRandoms(int arr[]);
void newValueInput(int value[]);
void SinglePrintMatrix(int matrix[9][9]);

void main() {
  int values[9] = { 1,2,3,4,5,6,7,8,9 };
  srand(time(0));
  inputRandoms(values);
  for (int i = 0; i <= 7; i++) {
    if (count == 0) {
      inputRow(matrix, values, &count);
    }
    else {
      newValueInput(values);
    }
  }
  SinglePrintMatrix(matrix);
  getch();
}

// inputs the row in the matrix
void inputRow(int matrix[9][9], int suffeledArr[], int* count) {
  for (int i = 0; i < 9; i++) {
    matrix[*count][i] = suffeledArr[i];
  }
  (*count)++;
}

//generates new inputs and cheaks for uniqueness in colunm, if not unique then rerolls with      //inputRandoms() function
void newValueInput(int value[]) {
  inputRandoms(value);
  int temp[9] = { 0 };
  int i, k = count;

  for (int j = 0; j < 9; j++) {
    for (i = 0; i <= count; i++) {
      //puts the value of one colunm in temp[i]
      temp[i] = matrix[i][j];
    }
    //     //puts the latest value in temp without removing one of the data
    temp[count + 1] = value[j];
    // if(count!=k&&count!=8){
    //     temp[i+1]=value[i];
    // }
    for (k = count + 1; k >= 0; k--) {
      //cheaks for ununique value
      if (temp[k] == temp[8 - k]) {
        if (((k) / (8 - k)) == 1) {//is uniwue
          inputRow(matrix, value, &count);
          break;
        }
        else {//is not unique
          newValueInput(value);
          break;
        }
      }
    }
  }
}
//suffels the value[] array to generate unique combanition of values
void inputRandoms(int arr[]) {
  int j = 0, temp = 0, i = 0;
  for (i = 8; i > 0; i--) {
    while (j < 0 && j >= 10) {
      j = rand() % (i + 1); //segmentation error
    }
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }
}



// prints out the matrix
void SinglePrintMatrix(int matrix[9][9]) {
  printf("Matrix:\n");
  for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
      printf("%d ", matrix[i][j]);
    }
    printf("\n");
  }
  printf("\n");
}

我问了 ChatGPT 和其他一些 AI 该怎么做并尝试调试,但我不知道当我使用 GDB 时我在做什么。

c sudoku
1个回答
0
投票

您需要更改

inputRandoms
来修复循环并进行适当的洗牌。还要尝试确保
j
在范围内。另一个原因可能是您没有正确查找唯一列。这是一些改进的代码:

void inputRandoms(int arr[]) {
    for (int i = 8; i > 0; i--) {
        int j;
        do {
            j = rand() % (i + 1);
        } while (j < 0 || j >= 10);
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

void newValueInput(int value[]) {
    inputRandoms(value);
    int temp[9];
    for (int j = 0; j < 9; j++) {
        for (int i = 0; i <= count; i++) {
            temp[i] = matrix[i][j];
        }
        temp[count] = value[j];
        int unique = 1;
        for (int k = 0; k < count; k++) {
            if (temp[k] == temp[count]) {
                unique = 0;
                break;
            }
        }
        if (unique) {
            inputRow(matrix, value, &count);
            break;
        }
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.