Ver Mensaje Individual
  #1 (permalink)  
Antiguo 15/11/2013, 21:31
jordy48
 
Fecha de Ingreso: febrero-2012
Mensajes: 56
Antigüedad: 12 años, 9 meses
Puntos: 1
Pregunta Como iniciar una Matriz Dinamica en una Funcion???

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
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. int newMatDin(int **mat, int tam){
  6.     int i,j;
  7.     long int tot = (long int)pow(2,tam); //tam = columnas (J); //tot = 2^col (I)
  8.  
  9.     mat = (int **) malloc(tot * sizeof(int*));
  10.  
  11.     if (mat == NULL)
  12.         return -1;
  13.     else
  14.         printf("Comprobamos nueva direccion %p\n", mat); //Vemos que ya apunta a una direccion
  15.  
  16.  
  17.     for(i=0; i<tot; i++) {
  18.         mat[i] = (int *) malloc(tam * sizeof(int));
  19.         if (mat[i] == NULL)
  20.             return -1;
  21.     }
  22.  
  23.     for(i=0; i<tot; i++) {
  24.         for(j=0; j<tam; j++)
  25.             mat[i][j] = 0;
  26.     }
  27.     return 0;      
  28. }
  29.  
  30.  
  31. //****MAIN
  32. main() { //***TEST***
  33.     int **mat = NULL;
  34.     int n = 4, k=1, i,j, temp;
  35.  
  36.     temp = newMatDin(mat, n);
  37.     if (temp == 0) 
  38.         for(i=0; i<(int)pow(2,n); i++) {
  39.             for(j=0; j<n; j++)
  40.                 printf("%d  - ", mat[0][0]); //Violacion de Segmento, ya que mat = NULL, porque?
  41.             printf("\n");
  42.         }
  43.     else
  44.         printf("ERROR AL GENERAR MATRIZ\n");
  45.  
  46.     //Se generó bien la matriz, sin embargo **mat sigue apuntando a NULL
  47.     printf("**mat apunta a: %p", mat); // NULL  ---  Porque no apunta a la nueva dir dada en malloc??
  48. }






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
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. /** Generamos la matriz dinamica, todos los elementos en 0,
  6.  *  si hay error retorna -1, sino regresa 0.
  7.  */
  8. int newMatDin(int ***mat, int tam){
  9.     int i,j;
  10.     long int tot = (long int)pow(2,tam); //tam = columnas (J); //tot = 2^col (I)
  11.  
  12.     *mat = (int **) malloc(tot * sizeof(int*)); //No me da error
  13.  
  14.     if (*mat == NULL) //No hay problemas aca, ya tiene direccion
  15.         return -1;
  16.     else
  17.         printf("%p\n", *mat);
  18.  
  19.  
  20.     for(i=0; i<tot; i++) {
  21.         *mat[i] = (int *) malloc(tam * sizeof(int)); //En la segunda iteracion es cuando hay problemas
  22.         if (*mat[i] == NULL)
  23.             return -1;
  24.     }
  25.  
  26.     for(i=0; i<tot; i++) { //Ya no entra bien aca por los problemas anteriores
  27.         for(j=0; j<tam; j++)
  28.             *mat[i][j] = 0;
  29.     }
  30.     return 0;      
  31. }
  32.  
  33.  
  34.  
  35. //******
  36. main() {
  37.     int **mat = NULL;
  38.     int n = 4, k=1, i,j, temp;
  39.  
  40.     printf("MAT: %p\n",mat); //Apunta a NULL
  41.     temp = newMatDin(&mat, n); //Creamos la matriz
  42.     printf("MAT: %p\n",mat); //Apunta a la direccion asigana por MALLOC
  43.  
  44.     //Ya tengo bien el apuntador a la matriz dinamica inicializada en 0s solo que
  45.     //adentro de la funcion hay problemas y no termina el resto bien
  46.  
  47.     printf("%d\n\n", **mat); // ERROR: Violacion de Segmento
  48.  
  49.  
  50. }



Algun experto en el tema que pueda ayudarme?


Gracias