Ver Mensaje Individual
  #5 (permalink)  
Antiguo 07/02/2017, 14:42
Fw190
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 5 meses
Puntos: 73
Respuesta: problemas con punteros y matrices

Quieres representar una matriz mediante un doble puntero, con el fin de poder utilizar la notación clásica para los elementos de la matriz.

El primer fallo está en la función pedir_memoria():

Código C++:
Ver original
  1. void pedir_memoria(int ***a,int f,int c)

Con esa declaración, lo que estoy diciendo es "paso la dirección de un doble puntero para poderlo modificar". Es decir, el parámetro a representa un puntero a un doble puntero.

Para poder modificar un pàrámetro por referencia, tengo que decir "lo apuntado por a es igual a ...", luego ya tenemos fallo en la primera línea de la función. Debería ser:

Código C++:
Ver original
  1. *a = new int*[f]

o bien, empleando una variable intermedia (creo que te quedará más claro), dejar tu función pedir_memoria() como:

Código C++:
Ver original
  1. void pedir_memoria(int ***a,int f,int c)
  2. {
  3.     int **b;
  4.  
  5.     b = new int*[f];
  6.     for (int i = 0; i <f; i++)
  7.     {
  8.         b[i] = new int[c];
  9.     }
  10.     *a = b;
  11. }

Ves que dentro del bucle solamente se emplea un índice. Ese era otro fallo en tu código original, ten en cuenta que, ahora, b es un arreglo de punteros, cada uno de ellos apuntará a un arreglo de enteros. que es lo que constituirán las filas.

Una vez establecido que las matrices las estabas generando mal, ya sabes por qué te daba la excepción: estabas metiendo en memoria lo que no debías en donde no debías.

Para las demás funciones ya no necesitas el triple puntero puesto que ya no necesitas modificar el doble puntero. Pasando éste directamente, ya tienes acceso a los elementos sin necesidad de complicarte la vida (ya estás pasando las direcciones al pasar el puntero). Por ejemplo:

Código C++:
Ver original
  1. void rellenar_matriz(int **a, int indice, int f, int c)
  2. {
  3.     cout << "\nIngrese los valores de la matriz " << indice <<" : ";
  4.     for (int i = 0; i < f; i++)
  5.     {
  6.         for (int j = 0; j < c; j++)
  7.         {
  8.             cout << "\nIngrese el elemento [ " << i << ", " << j << " ]: ";
  9.             cin >> a[i][j];
  10.         }
  11.         printf("\n");
  12.     }
  13. }

y de una forma similar deberás modificar la función sumar_matrices().

En tu función main(), las llamadas a pedir_memoria() serían correctas, pero no las llamadas a rellenar_matriz() y sumar_matrices(). También serán correctas las llamadas a imprimir_matriz() y liberar_memoria(). Pero, en el caso de la función liberar_memoria(), ten en cuenta que pmatriz1, pmatriz2 y psumas siguen apuntando a un bloque de memoria que ya se liberó. En este caso no tiene importancia, dado que el programa se acaba, pero puede dar lugar a problemas si no tienes cuidado en programas grandes en donde pretendas reutilizar esas variables.

Sobre la conversión usando índices... bueno, si partíamos de una matriz mal creada... pero, de todos modos, con lo que te he contado, no necesitarás el triple índice más que en la creación de la matriz.

Espero haber arrojado algo de claridad sobre el tema.

Saludos,