PI-ITBA / 2024_02

Consultas 2C 2024
3 stars 0 forks source link

esMagica - R1 1C 2018 #6

Open matsdah opened 3 weeks ago

matsdah commented 3 weeks ago

Buen día, estuve intentando hacer este ejercicio de parcial varias veces y en la función checkNumbers no entiendo en que momento ocurre el stack overflow, algún problema con vecApar quizás?

También tenia duda con la variable sumaComp, no sabría como comparar la suma de filas y columnas sin haber hecho la suma de alguna fila o columna previamente. El código con el test (la matriz es mágica) y lo que devuelve AddressSanitizer. Algo que note es que si se corren primero las funciones checkFils y checkCols el programa funciona cuando no es mágica (no llega a ejecutarse checkNumbers). Espero que se entienda, muchas gracias por supuesto.

Codigo:

#define N 3
#include <stdio.h>

int esMagica(int m[N][N]);
int checkNumbers(int m[][N]);
int checkFils(int m[]);
int checkCols(int m[][N], int index);

int main() {
    int m[N][N] = {{4, 9, 2},
        {3, 5, 7},
        {8, 1, 1}};
    if(esMagica(m)) {
        puts("Es magica!");
    } else {
        puts("No es magica.");
    }
    return 0;
}

/* Devuelve si una matriz es magica o no. */
int esMagica(int m[N][N]){
    if(checkNumbers(m)) {
        int sumaComp = checkFils(m[0]);     /* En cada suma de filas y columnas comparo con este numero. */
        int sumaFil;                        /* Suma para las filas. */
        int sumaCol;                        /* Suma para las columnas. */
        for(int i = 0; i < N; i++){
            sumaFil = checkFils(m[i]);
            sumaCol = checkCols(m, i);
            if(sumaFil != sumaComp || sumaCol != sumaComp){
                /* Hay una suma desigual. */
                return 0;
            }
        }
        return 1;
    }
    return 0;
}

int checkCols(int m[][N], int index) {
    int sumaCol = 0;
    for(int i = 0; i < N; i++) {
        /* Recorro las filas en la columna fijada. */
        sumaCol += m[i][index];
    }
    return sumaCol;
}

int checkFils(int m[]) {
    int sumaFil = 0;
    for(int j = 0; j < N; j++) {
        sumaFil += m[j];
    }
    return sumaFil;
}

int checkNumbers(int m[][N]) {
    int vecApar[N*N] = {0};             /* Inicializo el vector apariciones. */
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++) {
            if(m[i][j] < 1 || m[i][j] > N*N || vecApar[m[i][j]] >= 1){
                /* Esta repetido o no es valido. */
                return 0;
            }
            /* Figura por primera vez. */
            vecApar[m[i][j]-1]++;
        }
    }
    return 1;
}

AddressSanitizer:

Captura de pantalla 2024-08-21 102017

ImNotGone commented 3 weeks ago

Si compilas con -g te tira la linea del archivo en el error

ImNotGone commented 3 weeks ago

Cuando accedes al vec en el if no le restas 1

matsdah commented 3 weeks ago

Gracias Gonza ahí quedo!