Dev - C++ - Matrices memoria dinamica

   
Vista:

Matrices memoria dinamica

Publicado por Bryan (1 intervención) el 27/07/2016 02:24:33
Buena Necesito su ayuda intento imprimir la matriz de cualquier orden pero el ultimo digito de la diagonal me coloca 0 o otro valor ayuda por favor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void llenar_matriz(int, int);
void diag_principal(int, int);
void diag_secundaria(int, int);
void combinar(int, int);
 
main()
{
    int f, c, **p, i, j;
    printf("\nIngrese la dimension de la matriz:\n");
    scanf("%d",&f);
    c=f;
    p = (int **)malloc(f*sizeof(int));
    for(i=0;i<f;i++)
        p[i]=(int *)malloc(c*sizeof(int));
    llenar_matriz(f, c);
    diag_principal(f, c);
    /* while(op != 5)
       {
            printf("\nIngrese un opcion:\n");
    printf("1.- Mostrar la Diagonal Principal \n");
    printf("2.- Mostrar la Diagonal  Secundaria \n");
    printf("3.- Mostrar la combinacion de diagonales\n");
    printf("4.- Salir\n");
    scanf("%d",&op);
       }*/
}
void llenar_matriz(int f, int c)
{
    srand(time(NULL));
     int m[f][c];
 
    for(int i=0;i<f;i++)
        {
           for(int j=0;j<c;j++)
           {
             m[i][j]=rand()%100;
           }
       }
    printf("\n La matriz Generadas\n");
 
    for(int i=0;i<f;i++)
        {
           for(int j=0;j<c;j++)
           {
            printf("\t %d",m[i][j]);
           }
           printf("\n");
       }
}
void diag_principal(int f, int c)
{
    int m[f][c];
    printf("La Diagonal Principal Superior es:\n");
             for(int i=0;i<f;i++)
                    {
                        for(int j=0;j<c;j++)
                         if(i==j)
                         {
                             printf("%d \t", m[i][j]);
                         }
                         else
                         printf("\t ");
                         printf("\n");
                    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Matrices memoria dinamica

Publicado por Capitan Kirk capitan.kirk09@gmail.com (44 intervenciones) el 28/07/2016 13:38:36
Cuando llamas a las funciones llenar_matriz() y diag_princiapl(), estás pasando como parámetros f y c, que se supone que son las filas y columnas de tu matriz.

Ahora bien, una vez que estás dentro de esas funciones, vuelves a crear una matriz m[f][c]. Esa matriz es local a la función, y desaparece al finalizar la función.

En llenar_matriz(), te la imprimirá correctamente, dado que cuando la imprimes aún no has salido de la función en la que has creado la matriz. En cuanto a diag_principal(), si te imprime correctamente parte de los valores, es porque casualmente, al crear m[f][c], el espacio de memoria donde te genera la matriz coincide en parte con el que utilizó para generarla en la otra función.

Solución:

1. Dado que se trata de matrices cuadradas, solamente necesitas guardar un tamaño (f ó c, dado que el otro será igual).

2. La asignación de memoria para p (quer definiste como int **p) es correcta. Es este puntero el que debes pasar como parámetro, así como la dimensión. Por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
void llenar_matriz(int **matriz, int tamanyo)
{
    srand(time(NULL));
 
    for(int i=0; i<tamanyo; i++)
        {
           for(int j=0; j<tamanyo; j++)
           {
             matriz[i][j]=rand()%100;
           }
       }
}

(ya no pongo la parte en la que imprimes la matriz generada)

La llamada sería:

1
llenar_matriz (p, f);

(suponiendo que utilices f para guardar el tamaño).

De forma similar se procedería en la llamada a diag_principal().

Otra cosa importante: Cuando utilices memoria dinámica, acostúmbrate a liberarla cuando ya no la necesites (y, de ser posible, en orden inverso al de su reserva). En un caso como este, no habría problema, dado que se trata de un programa pequeño y se supone que los recursos se liberan al finalizar el programa, pero en programas más grandes puedes encontrarte con que la memoria va desapareciendo poco a poco (memory leak, en inglés).

En este caso:

1
2
3
for (i=f-1; i>=0; i--)
     free(p[i]);
free(p);

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar