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;
}
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 convecApar
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 funcionescheckFils
ycheckCols
el programa funciona cuando no es mágica (no llega a ejecutarsecheckNumbers
). Espero que se entienda, muchas gracias por supuesto.Codigo:
AddressSanitizer: