PI-ITBA / 2024_01

8 stars 0 forks source link

TP6_EJ20 #116

Closed martunud closed 3 months ago

martunud commented 5 months ago

Hola, ahi estaba fijandome ejercicios de la guia para repasar y me habia quedado pendiente terminar bien este (el de sudoku). Me salta un error de segmentation fault y no se por que. Es medio largo pero si encuentran el error me serviria mucho (me compila sin warnings):


int sudokuSolver(char m[][DIM]){
    int i, j, bien = 0;
    for(i = 0; i <= DIM - 3; i+=3){
        for(j = 0; j <= DIM - 3; j +=3){
            int valor = mat3x3Val(m, i, j);
            if(valor){
                bien = valor;
            }
        }
    }
    if(bien){
        for(i = 0; i < DIM; i++){
            int valor = filaVal(m, i);
            int valor1 = colVal(m, i);
            if(valor && valor1){
                bien = valor;
            } 
        }   
    } 
    return bien;
}

int mat3x3Val(char mat[][DIM], unsigned int fila, unsigned int col){
    int i, j;
    char vecAp[DIM] = {0};
    for(i = fila; i < fila + 3; i++ ){ 
        for(j = col; j < col + 3; j++){
            if((mat[i][j] <= 0 || mat[i][j] > 9) ||!numsVals(mat[i][j], vecAp)){
                return 0;
            }
        }
    }
    return 1;
}

int filaVal (char mat[][DIM], unsigned int fila){
    int j;
    char vecAp[DIM] = {0}; 
        for(j = 0; j < DIM; j++){
            if(!numsVals(mat[fila][j], vecAp)){
                return 0;
            }
        }
    return 1;    
}

int colVal(char matr[][DIM], unsigned int colum){
    int i;
    char vecAp[DIM] = {0};
    for(i = 0; i < DIM; i++){
        if(!numsVals(matr[i][colum], vecAp)){
            return 0;
        }
    }
    return 1;        
}

int numsVals(unsigned int elem, char vectorApariciones[]){    
    if(vectorApariciones[elem-1] == 0){
        vectorApariciones[elem-1] = 1;
    }else {
        return 0;
    }   
    return 1;   
}  
marcelogarberoglio commented 5 months ago

¿Tenés idea al menos en cuál de las funciones aborta? Más allá de eso, tendrías que evitar hacer estas cosas

if(mat3x3Val(m, i, j)){ bien = mat3x3Val(m, i, j); } porque estás calculando todo dos veces. Además sólo asign;as a bien el valor 1 si alguna de las submatices (o filas o columnas) está bien, y tienen que estar todas bien. Tendría que ser

if(!mat3x3Val(m, i, j)){ return 0; }

martunud commented 5 months ago

Perfecto, ahi lo corregi, tambien me di cuenta que uno de los fors estaba de mas. Con lo del error me salto esto: ==53707==The signal is caused by a READ memory access.

0 0x101945a16 in numsVals ej20.c:147

#1 0x10194555b in mat3x3Val ej20.c:115
#2 0x101945250 in sudokuSolver ej20.c:87
#3 0x101943b0e in main ej20.c:17
ImNotGone commented 5 months ago

Estas excediendo el tamaño del vector seguramente pq accedes con un numero >=10 fijate que en el chequedo de rango pusiste && y va ||

ImNotGone commented 5 months ago

Aca:

(mat[i][j] <= 0 && mat[i][j] > 9)

Asi como esta va a dar siempre falso no hay numero <= 0 y > 9

martunud commented 5 months ago

Claroo, ahi lo corregi era eso, pero aborta en este assert: char sudoku3[DIM][DIM] = { {2,8,1,9,7,6,5,4,2}, {3,4,7,5,3,8,1,9,6}, {5,6,9,2,1,4,8,7,3}, {6,7,4,8,5,2,3,1,9}, {1,3,5,7,4,9,6,2,8}, {9,2,8,1,6,3,7,5,4}, {4,1,2,6,8,5,9,3,7}, {7,9,6,3,2,1,4,8,5}, {8,5,3,4,9,7,2,6,1} };

assert(sudokuSolver(sudoku3)==0);

ImNotGone commented 5 months ago

Deberia fallar con la primera fila (hay 2 2), cuando llegue a casa lo reviso

marcelogarberoglio commented 5 months ago

Yo marqu;é esto

_Además sólo asign;as a bien el valor 1 si alguna de las submatices (o filas o columnas) está bien, y tienen que estar todas bien. Tendría que ser

if(!mat3x3Val(m, i, j)){ return 0; }_

y decís que lo corregiste. Pero veo esto

int valor = mat3x3Val(m, i, j); if(valor){ bien = valor; }

y seguis haciendo lo mismo: le asignás 1 a bien si alguna de las submatrices está bien, sin importar el resto. Tienen que aprender a poder seguir el código que hicieron.

martunud commented 5 months ago

Ahi va, perdon Marcelo me maree con las correcciones, ahi lo corregi bien y paso el test, muchas gracias.