Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Manu_The_King en 4 Enero 2013, 17:04 pm



Título: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: Manu_The_King en 4 Enero 2013, 17:04 pm
Hola y muy buenas gente,

voy a intentar resumir un poco mi problema, a ver si podeis echarme un cable  :D

vereis estoy trabajando con una matriz base donde el usuario introduce la dimension y los valores, despues accedera a un menu con distintas opciones.

Ya he realizado 2 funciones distintas sin problema, pero ahora en la 3a, cuando intenta hacer algo con la matriz salta el segmentation fault, he llegado a la conclusión de que en la funcion, la matriz no tiene los valores que deberia y por eso salta.

La funcion en cuestion es:

Código:
void Trasposada(int fil,int col,int mat[MAX][MAX])
{
    int i, j;
    int tras[MAX][MAX];

    for(i=0;i<fil;i++)
        for(j=0;j<col;j++)
            tras[i][j]=mat[i][j];

    for(j=0;j<fil;j++)
    {
        for(i=0;i<col;i++)
            printf("%d", mat[i][j]);
        printf("\n");
    }

}

Gracias de antemano ^^


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: avesudra en 4 Enero 2013, 17:15 pm
Es que así solo con la función no se que hace, esta función que es ¿para mostrar la matriz? , que valores debo pasarle a fil y a col, ¿el valor de MAX? Es que si no no puedo probar xD. Si pudieses poner el código entero lo miramos mejor porque igual el problema no es la función si no los valores que se pasan.

¡Un saludo!


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: Manu_The_King en 4 Enero 2013, 17:21 pm
te dejo el main (las otras funciones no intervienen)

Código:
#include <stdio.h>
#include <stdlib.h>
#define MAX 10

void Trasposada(int fil,int col,int mat[MAX][MAX])
{
    int i, j;
    int tras[MAX][MAX];

    for(i=0;i<fil;i++)
        for(j=0;j<col;j++)
            tras[i][j]=mat[i][j];

    for(j=0;j<fil;j++)
    {
        for(i=0;i<col;i++)
            printf("%d", mat[i][j]);
        printf("\n");
    }

}


int main()
{
    int  i, j, fil=0, col=0, maxm, maxf;
    int mat[MAX][MAX];

//leer nº de filas y columnas

    printf("Indica les FILES que tindra la matriu(max 10):\n");
    scanf("%d", &fil);
    while(fil>MAX)
    {
        printf("Error. Has d'introduir un valor menor de 10\n");
        scanf("%d", &fil);
    }

    printf("Indica les COLUMNES que tindra la matriu(max 10):\n");
    scanf("%d", &col);
    while(col>MAX)
    {
        printf("Error. Has d'introduir un valor menor de 10\n");
        scanf("%d", &col);
    }

//meter valores

    for(i=0;i<fil;i++)
    {
        printf("Introdueix els valors de la fila %d\n", i);
        for(j=0;j<col;j++)
            scanf("%d", &mat[i][j]);
    }


    Trasposada(fil,col,mat[MAX][MAX]);



    return 0;
}

en si el problema es, que no entiendo porque dentro de la funcion Trasposada la matriz no mantiene los valores, mientras que en las otras funciones si lo hace


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: avesudra en 4 Enero 2013, 17:38 pm
Pues es un despiste, date cuenta que si le pasas a la función esto:
Código
  1. for(i=0;i<fil;i++)
  2.    {
  3.        printf("Introdueix els valors de la fila %d\n", i);
  4.        for(j=0;j<col;j++)
  5.            scanf("%d", &mat[i][j]);
  6.    }
  7.  
  8.  
  9.    Trasposada(fil,col,mat[MAX][MAX]);//<------------------------- Me refiero a eso
Es lo mismo que hacer esto:
Código
  1. Trasposada(fil,col,mat[10][10]);
Y tu le tienes que pasar la dirección inicial de la matriz es decir la 0,0 para que la vaya recorriendo:
Código
  1. Trasposada(fil,col,mat[0][0]);
O si lo prefieres así:
Código
  1. Trasposada(fil,col,&mat);
El código no mantenía los valores porque estaba accediendo a una memoria que estaba inicializada pero con valores aleatorios  :silbar:
Así que el código quedaría así:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 10
  4.  
  5. void Trasposada(int fil,int col,int mat[MAX][MAX])
  6. {
  7.    int i, j;
  8.    int tras[MAX][MAX];
  9.  
  10.    for(i=0; i<fil; i++)
  11.        for(j=0; j<col; j++)
  12.            tras[i][j]=mat[i][j];
  13.  
  14.    for(j=0; j<fil; j++)
  15.    {
  16.        for(i=0; i<col; i++)
  17.            printf("%d",mat[i][j]);
  18.        printf("\n");
  19.    }
  20.  
  21. }
  22.  
  23. int main()
  24. {
  25.    int  i, j, fil=0, col=0, maxm, maxf;
  26.    int mat[MAX][MAX];
  27.    for(i=0; i!= MAX; ++i)
  28.    {
  29.        for(j=0; j!= MAX; ++j)
  30.            mat[i][j]=0;
  31.    }
  32.    //leer nº de filas y columnas
  33.  
  34.    printf("Indica les FILES que tindra la matriu(max 10):\n");
  35.    scanf("%d", &fil);
  36.    while(fil>MAX)
  37.    {
  38.        printf("Error. Has d'introduir un valor menor de 10\n");
  39.        scanf("%d", &fil);
  40.    }
  41.  
  42.    printf("Indica les COLUMNES que tindra la matriu(max 10):\n");
  43.    scanf("%d", &col);
  44.    while(col>MAX)
  45.    {
  46.        printf("Error. Has d'introduir un valor menor de 10\n");
  47.        scanf("%d", &col);
  48.    }
  49.  
  50.   //meter valores
  51.  
  52.    for(i=0; i<fil; i++)
  53.    {
  54.        printf("Introdueix els valors de la fila %d\n", i);
  55.        for(j=0; j<col; j++)
  56.            scanf("%d", &mat[i][j]);
  57.    }
  58.  
  59.    Trasposada(fil,col,&mat);
  60.  
  61.    return 0;
  62. }


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: Manu_The_King en 4 Enero 2013, 17:42 pm
que grande eres y que mal estoy xD estos examenes me tienen el cerebro frito

muchas gracias por la ayuda!!


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: rir3760 en 4 Enero 2013, 18:26 pm
En el caso de los arrays cuando su identificador se utiliza en una llamada a funcion no es necesario el operador "direccion de" (el '&'). Esta sentencia:
Código
  1. Trasposada(fil,col,&mat);
Se puede reducir a:
Código
  1. Trasposada(fil, col, mat);
Sin problemas.

Un saludo


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: Manu_The_King en 5 Enero 2013, 17:22 pm
Buenas, vuelvo a tener problemas con esta fucion -.-'

ahora ya lo tengo todo montado y funciona correctamente, el único problema es que en esta misma funcion (trasposada) no lee los valores de la matriz original, por lo que sigue teniendo valores aleatorios, os dejo el condigo con el main a ver si me podeis echar una mano


Código:
int Trasposada(int tras[MAX][MAX],int fil,int col, int mat[MAX][MAX])
{
    int i, j;

    for (i=0;i<fil;i++)
        for (j=0;j<col;j++)
        {
            tras[j][i] = mat[i][j];

        }
    for (i=0;i<fil;i++)
    {
        for (j=0;j<col;j++)
            printf("%d ", &mat[i][j]);   //lo he puesto asi para probar si realmente leia la matriz
        printf("\n");
    }


}




int main()
{
    int  i, j, fil=0, col=0, maxm, maxf, x, opinf, opsup;
    int mat[MAX][MAX];
    int esc[MAX][MAX];
    int tras[MAX][MAX];

    printf("Benvingut al programa. MATRIUS.\n\n");


    printf("Indica les FILES que tindra la matriu(max 10):\n");
    scanf("%d", &fil);
    while(fil>MAX)
    {
        printf("Error. Has d'introduir un valor menor de 10\n");
        scanf("%d", &fil);
    }

    printf("Indica les COLUMNES que tindra la matriu(max 10):\n");
    scanf("%d", &col);
    while(col>MAX)
    {
        printf("Error. Has d'introduir un valor menor de 10\n");
        scanf("%d", &col);
    }

    for(i=0;i<fil;i++)
    {
        printf("Introdueix els valors de la fila %d\n", i);
        for(j=0;j<col;j++)
            scanf("%d", &mat[i][j]);
    }


//    dimensio(fil);
//    valors(fil, col, mat);
    printf("\n\nLa matriu introduida es:\n\n");
    for(i=0;i<fil;i++)
        {
            for(j=0;j<col;j++)
                printf("%d ",mat[i][j]);
            printf("\n");
        }

    while(x!=0)
    {




        menu();
        x=Opcio(opinf, opsup);

        switch(x)
        {
            case 1:Valor_Maxim_M(maxm, fil, col, mat);break;
            case 2:Valor_Maxim_F(maxf, fil, col, mat);break;
            case 3:Trasposada(tras,fil,col,mat);break;   
            case 4:Escalar(esc,fil,col,mat);break;
            case 5:Identitat(fil,col,mat);break;
            case 0: printf("FINALITZA EL PROGRAMA\n\n");break;
            default: printf("Has introduit malament la opcio. Torna a intentar-ho.\n\n");
        }
    }


    return 0;
}


Muchas gracias de antemano :)


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: avesudra en 5 Enero 2013, 17:50 pm
Pon los valores con los que pruebas por favor  :) porque con una matriz de 3x3 parece que funciona.


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: Manu_The_King en 5 Enero 2013, 18:01 pm
tal i como esta te da bien los valores por pantalla??? es que a mi me da valores aleatorios :S

he estado probando con

1 fila, 4 columnas, valores: 1234

2 filas, 3 columnas, valores 123
                                         456


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: avesudra en 5 Enero 2013, 18:08 pm
Tal y como está no porque me dan errores de compilacion porque me faltan la mitad de las funciones :laugh: Está así:
Código
  1. #include <stdio.h>
  2. #define MAX 10
  3. int Trasposada(int tras[MAX][MAX],int fil,int col, int mat[MAX][MAX])
  4. {
  5.    int i, j;
  6.  
  7.    for (i=0; i<fil; i++)
  8.        for (j=0; j<col; j++)
  9.        {
  10.            tras[j][i] = mat[i][j];
  11.  
  12.        }
  13.    for (i=0; i<fil; i++)
  14.    {
  15.        for (j=0; j<col; j++)
  16.            printf("%d ", mat[i][j]);   //lo he puesto asi para probar si realmente leia la matriz
  17.        printf("\n");
  18.    }
  19.  
  20.  
  21. }
  22. int main()
  23. {
  24.    int  i, j, fil=0, col=0, maxm, maxf, x, opinf, opsup;
  25.    int mat[MAX][MAX];
  26.    int esc[MAX][MAX];
  27.    int tras[MAX][MAX];
  28.  
  29.    printf("Benvingut al programa. MATRIUS.\n\n");
  30.  
  31.  
  32.    printf("Indica les FILES que tindra la matriu(max 10):\n");
  33.    scanf("%d", &fil);
  34.    while(fil>MAX)
  35.    {
  36.        printf("Error. Has d'introduir un valor menor de 10\n");
  37.        scanf("%d", &fil);
  38.    }
  39.  
  40.    printf("Indica les COLUMNES que tindra la matriu(max 10):\n");
  41.    scanf("%d", &col);
  42.    while(col>MAX)
  43.    {
  44.        printf("Error. Has d'introduir un valor menor de 10\n");
  45.        scanf("%d", &col);
  46.    }
  47.  
  48.    for(i=0; i<fil; i++)
  49.    {
  50.        printf("Introdueix els valors de la fila %d\n", i);
  51.        for(j=0; j<col; j++)
  52.            scanf("%d", &mat[i][j]);
  53.    }
  54. //    dimensio(fil);
  55. //    valors(fil, col, mat);
  56.    printf("\n\nLa matriu introduida es:\n\n");
  57.    for(i=0; i<fil; i++)
  58.    {
  59.        for(j=0; j<col; j++)
  60.            printf("%d ",mat[i][j]);
  61.        printf("\n");
  62.    }
  63.  
  64.    x=3;
  65.    switch(x)
  66.    {
  67.        /* case 1:Valor_Maxim_M(maxm, fil, col, mat);break;
  68.          case 2:Valor_Maxim_F(maxf, fil, col, mat);break;*/
  69.    case 3:
  70.        Trasposada(tras,fil,col,mat);
  71.        break;
  72.        /*case 4:Escalar(esc,fil,col,mat);break;*/
  73.        /* case 5:Identitat(fil,col,mat);break;
  74.          case 0: printf("FINALITZA EL PROGRAMA\n\n");break;*/
  75.    default:
  76.        printf("Has introduit malament la opcio. Torna a intentar-ho.\n\n");
  77.    }
  78.    return 0;
  79. }
La salida de ese código me da esto:
Código:
Indica les FILES que tindra la matriu(max 10):
2
Indica les COLUMNES que tindra la matriu(max 10):
3
Introdueix els valors de la fila 0
1
2
3
Introdueix els valors de la fila 1
4
5
6


La matriu introduida es:

1 2 3
4 5 6
1 2 3
4 5 6

Process returned 0 (0x0)   execution time : 22.177 s
Press any key to continue.


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: Manu_The_King en 5 Enero 2013, 18:23 pm
vale te paso lo que me da el programa por pantalla, la cosa debe ser o del main o de la funcion porque las demas funciones hacen su trabajo completamente. lo que no entiendo es porque en este caso la matriz no se queda con los valores que le he introducido

(http://i90.photobucket.com/albums/k252/Manu_The_King/matr_zps07b83410.png)


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: avesudra en 5 Enero 2013, 18:38 pm
El fallo está aquí(en la impresión , quita el ampersand):
Código
  1. int Trasposada(int tras[MAX][MAX],int fil,int col, int mat[MAX][MAX])
  2. {
  3.    int i, j;
  4.  
  5.    for (i=0; i<fil; i++)
  6.        for (j=0; j<col; j++)
  7.        {
  8.            tras[j][i] = mat[i][j];
  9.  
  10.        }
  11.    for (i=0; i<fil; i++)
  12.    {
  13.        for (j=0; j<col; j++)
  14.            printf("%d ", &mat[i][j]);   //<---------------- EOOOOO que hace ese ampersand ahí???? Arriba pone que lo pusiste para probar pero es que te está imprimiendo las direcciones de memoria
  15.        printf("\n");
  16.    }
  17.  
  18.  
  19. }
Además es lógico, los valores que te salen son:
Código:
2293100
2293104
2293108
2293112
¿De cuatro en cuatro? No es casualidad... , son direcciones de memoria de un arreglo de int's porque va de 4 en cuatro bytes.


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: Manu_The_King en 5 Enero 2013, 19:10 pm
joderrr y tanto tiempo perdid por eso... mil gracias en serio :D:D


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: avesudra en 5 Enero 2013, 20:15 pm
La programación es así, los errores tontos son los que son más difíciles de ver, me alegro de que ya te funcione , de nada  ;D


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: 0xDani en 5 Enero 2013, 21:44 pm
Lo extraño es que el compilador no te diese un warning al utilizar el especificador "%d" para imprimir una direccion de memoria.

Saludos.


Título: Re: Segmentation Fault al realizar funcion sobre Matriz
Publicado por: avesudra en 5 Enero 2013, 21:53 pm
Si que lo da:
Código:
C:\Users\xxx\main.c|16|warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat]|
Pero hay que tenerlos activados, cuando se compila por consola si no me equivoco hay que poner el comando -Wall para que te muestre todos los warnings...