Hola buen dia tengan todos ustedes.
Veran, tengo que hacer una matriz del tamaño [2^n] x [n] y bueno, lo que hago es que paso la n a una funcion para inicializar; utilizo una matriz dinamica, entonces en main declaro una variable "int **mat" y le paso mat a la funcion. con esto esperaba conseguir la matriz nueva generada por referenciacion en main, sin embargo me lleve la sorpresa que no era asi,
uso malloc en la funcion de generacion y el apuntador que me regresa malloc no lo consigue el apuntador de apuntador a mat
Paso directo al código:
Este fue mi primer código
Código C:
Ver original#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int newMatDin(int **mat, int tam){
int i,j;
long int tot
= (long int)pow(2,tam
); //tam = columnas (J); //tot = 2^col (I)
mat
= (int **) malloc(tot
* sizeof(int*));
if (mat == NULL)
return -1;
else
printf("Comprobamos nueva direccion %p\n", mat
); //Vemos que ya apunta a una direccion
for(i=0; i<tot; i++) {
mat
[i
] = (int *) malloc(tam
* sizeof(int)); if (mat[i] == NULL)
return -1;
}
for(i=0; i<tot; i++) {
for(j=0; j<tam; j++)
mat[i][j] = 0;
}
return 0;
}
//****MAIN
main() { //***TEST***
int **mat = NULL;
int n = 4, k=1, i,j, temp;
temp = newMatDin(mat, n);
if (temp == 0)
for(i
=0; i
<(int)pow(2,n
); i
++) { for(j=0; j<n; j++)
printf("%d - ", mat
[0][0]); //Violacion de Segmento, ya que mat = NULL, porque? }
else
printf("ERROR AL GENERAR MATRIZ\n");
//Se generó bien la matriz, sin embargo **mat sigue apuntando a NULL
printf("**mat apunta a: %p", mat
); // NULL --- Porque no apunta a la nueva dir dada en malloc?? }
Entonces en lo que le movia a las cosas que se me ocurrian hice este otro, donde paso la
direccion del puntero de puntero MAT, y
cuando se termina la ejecución de la función, MAT ya cuenta con la direccion que nos dió malloc. Sin embargo ya se me hace muy dificil el manejo de los apuntadores dentro de la funcion y
ahora la "Violacion de Segmento" se genera dentro de la funcion
Aca mi segundo código:
Código C:
Ver original#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/** Generamos la matriz dinamica, todos los elementos en 0,
* si hay error retorna -1, sino regresa 0.
*/
int newMatDin(int ***mat, int tam){
int i,j;
long int tot
= (long int)pow(2,tam
); //tam = columnas (J); //tot = 2^col (I)
*mat
= (int **) malloc(tot
* sizeof(int*)); //No me da error
if (*mat == NULL) //No hay problemas aca, ya tiene direccion
return -1;
else
for(i=0; i<tot; i++) {
*mat
[i
] = (int *) malloc(tam
* sizeof(int)); //En la segunda iteracion es cuando hay problemas if (*mat[i] == NULL)
return -1;
}
for(i=0; i<tot; i++) { //Ya no entra bien aca por los problemas anteriores
for(j=0; j<tam; j++)
*mat[i][j] = 0;
}
return 0;
}
//******
main() {
int **mat = NULL;
int n = 4, k=1, i,j, temp;
printf("MAT: %p\n",mat
); //Apunta a NULL temp = newMatDin(&mat, n); //Creamos la matriz
printf("MAT: %p\n",mat
); //Apunta a la direccion asigana por MALLOC
//Ya tengo bien el apuntador a la matriz dinamica inicializada en 0s solo que
//adentro de la funcion hay problemas y no termina el resto bien
printf("%d\n\n", **mat
); // ERROR: Violacion de Segmento
}
Algun experto en el tema que pueda ayudarme?
Gracias