gpt4 book ai didi

c - 如何解决C中进程返回-1073741819的错误

转载 作者:行者123 更新时间:2023-11-30 21:29:39 25 4
gpt4 key购买 nike

这将是一款扫雷游戏,但尚未完成。现在,程序应该询问您数组的大小和地雷的数量。然后,它显示隐藏的棋盘(带有数字和“X”的棋盘)。仅此而已。

问题是程序因此错误而停止工作

process returned -1073741819 <0xC0000005>

我认为是内存问题,但不知道问题出在哪里。

抱歉,因为评论是西类牙语。我会尝试添加一些大写字母以使其易于理解。代码:

main.c

#include <stdio.h>
#include <stdlib.h>
#include "Tablero/tablero.h"
#include <stdbool.h>

int main()
{
int fils, cols, nMinas; //ROWS, COLUMNS, NUMBER OF MINES
printf("Introduzca el número de filas: ");
scanf("%d", &fils);
printf("Introduzca el número de columna: ");
scanf("%d", &cols);
printf("Introduzca el número de minas: ");
scanf("%d", &nMinas);

Tablero tab = crearTablero(fils, cols, nMinas);//CREATE BOARD
mostrarTablero(tab.tabOculto, tab.x, tab.y);//SHOW HIDDEN BOARD

liberarTablero(tab);//FREE THE MEMORY

return 0;
}

tablero.h

#ifndef TABLERO_H_INCLUDED
#define TABLERO_H_INCLUDED

typedef struct{
int x;//ROWS
int y;//COLUMNS
int numMinas;//NUMBER OF MINES
char **tabOculto;//HIDDEN BOARD
char **tabVisible;//VISIBLE BOARD
} Tablero;

Tablero crearTablero(int x, int y, int numMinas);//CREATE BOARD

void mostrarTablero(char **tab, int x, int y);//SHOW BOARD

void liberarTablero(Tablero tab);//FREE BOARD

#endif // TABLERO_H_INCLUDED

tablero.c

#include "tablero.h"
#include <stdio.h>
#include<stdlib.h>
#include<time.h>

//CREATE BOARD
Tablero crearTablero(int x, int y, int numMinas){
Tablero tab;

tab.x = x;//ROWS
tab.y = y;//COLUMNS
tab.numMinas = numMinas;//NUMBER OF MINES
int i, j, k, l;

//Iniciamos y establecemos el contenido del tablero que se va a ver por consola
//INITIATE AND ESTABLISH THE CONTENT OF THE VISIBLE BOARD
tab.tabVisible = (char**) malloc (x * sizeof(char*));
for(i = 0; i < x; i++)
tab.tabVisible[i] = (char*) malloc (y * sizeof(char));
//Rellenamos con asteriscos para marcar la casilla normal
for(i = 0; i < x; i++)
for(j = 0; j < y; j++)
tab.tabVisible[i][j] = '*';

//Iniciamos y establecemos el contenido del tablero oculto, que se irá identificando
//INITIATE AND ESTABLISH THE CONTENT OF THE HIDDEN BOARD
tab.tabOculto = (char**) malloc (x * sizeof(char*));
for(i = 0; i < x; i++)
tab.tabOculto[i] = (char*) malloc (y * sizeof(char));
//Rellenamos con ceros antes de distribuir minas
//FIRST, FILL EVERYTHING WITH '0'
for(i = 0; i < x; i++)
for(j = 0; j < y; j++)
tab.tabOculto[i][j] = '0';
//Introducimos las minas aleatoriamente
//ESTABLISH RANDOM MINE POSITION
srand(time(NULL));
for(i = 0; i < tab.numMinas; i++)
tab.tabOculto[(int)rand() % x][(int)rand() % y] = 'X';

//Ponemos los números según las minas que tengan alrededor
//PUT THE NUMBERS DEPENDING ON THE QUANTITY OF MINES AROUND AND THE POSITION
for(i = 0; i < x; i++)
for(j = 0; j < y; j++)
if(tab.tabOculto[i][j] == 'X'){
//Esquina superior izquierda: de posx, posy a posx+1, posy+1
if(i == 0 && j == 0){
for(k = i; k <= i+1; k++)
for(l = j; l <= j+1; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Esquina superior derecha: de posx, posy-1 a posx+1, posy
else if(i == 0 && j == y){
for(k = i; k <= i+1; k++)
for(l = j-1; l <= j; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Esquina inferior izquierda: de posx-1, posy a posx, posy+1
else if(i == x && j == 0){
for(k = i-1; k <= i; k++)
for(l = j; l <= j+1; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Esquina inferior derecha: de posx-1, posy-1 a posx, posy
else if(i == x && j == y){
for(k = i-1; k <= i; k++)
for(l = j-1; l <= j; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Borde superior: de posx, posy-1 a posx+1, posy+1
else if(i == 0){
for(k = i; k <= i+1; k++)
for(l = j-1; l <= j+1; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Borde inferior: de posx-1, posy-1 a posx, posy+1
else if(i == x){
for(k = i-1; k <= i; k++)
for(l = j-1; l <= j+1; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Borde izquierdo: de posx-1, posy a posx+1, posy+1
else if(j == 0){
for(k = i-1; k <= i+1; k++)
for(l = j; l <= j+1; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Borde derecho: de posx-1, posy-1 a posx+1, posy
else if(j == y){
for(k = i-1; k <= i+1; k++)
for(l = j-1; l <= j; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Sin borde: de posx-1, posy-1 a posx+1, posy+1
else{
for(k = i-1; k <= i+1; k++)
for(l = j-1; l <= j+1; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
}
return tab;
}
//SHOW BOARD
void mostrarTablero(char **tab, int x, int y){
int i, j;
for(i = 0; i < x; i++){
for(j = 0; j < y; j++)
printf(" %c ", tab[i][j]);
printf("\n");
}
}
//FREE BOARD
void liberarTablero(Tablero tab){
//liberamos la memoria reservada a los arrays
int i;
for(i = 0; i < tab.x; i++){
free(tab.tabOculto[i]);
free(tab.tabVisible[i]);
}
free(tab.tabOculto);
free(tab.tabVisible);
}

最佳答案

当您确定何时位于右侧或底部边界时,您就成功了:

if (j == y)

这不可能是真的,因为它发生在条件为 j < y 的循环中。永远不会输入右边框和下边框大小写,您最终会访问 j + 1 处的字段。和i + 1 ,这是数组之外的一项。

您根本不需要区分不同的情况。大小写决定了要扫描的邻近区域的边界,但您可以通过简单的计算来完成此操作,然后在位于边界时调整范围:

int jmin = j - 1;
int jmax = j + 1;

if (j == 0) jmin = 0;
if (jmax == y) jmax = y - 1;

i 同样如此。这将消除大量重复代码。

关于c - 如何解决C中进程返回-1073741819的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29863462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com