Anuncio

Colapsar
No hay ningún anuncio todavía.

Programa de matrices

Colapsar
X
 
  • Filtro
  • Hora
  • Mostrar
Borrar todo
nuevos mensajes

  • C/C++ Programa de matrices

    Hola a todos, veréis, estoy haciendo un programa en C que sume dos matrices de dimensión nxm. El caso es que he escrito el programa, lo he complilado y montado sin problema, pero a la hora de ejecutar el programa me sale este error:

    Violación de segmento (`core' generado)

    Es la primera vez que me sale este error y no sé qué significa. He buscado por varias páginas pero no he visto una solución concreta al problema. ¿Alguien me podría decir que he hecho mal? Os dejo el código del programa por si acaso (siento que esté en catalán, pero creo que lo que ponga en los printfs no tiene relevancia en el problema):


    Código:
    #include<stdio.h>
    #define n 1000
    #define m 1000
    
    
    int main(void) {
            int i, j, v, u;
            int A[n][m], B[n][m], C[n][m];
    
    
            printf("Ara sumarem dues matrius de dimensió nxm.\n");
    
    
            printf("Dona'm la dimensió de la matriu A.\n");
            scanf("%d", &v);
    
    
            printf("Dona'm la dimensió de la matriu B.\n");
            scanf("%d", &u);
    
    
            for(i=0;i<v;i++){
            for(j=0;j<u;j++){
    
    
                    printf("Dona'm la component a%d%d.\n", i, j);
                    scanf("%d", &A[i][j]);
            }
            }
    
    
            for(i=0;i<v;i++){
            for(j=0;j<u;j++){
    
    
                    printf("Dona'm la component b%d%d.\n", i, j);
                    scanf("%d", &B[i][j]);
            }
            }
    
    
            for(i=0;i<v;i++){
            for(j=0;j<u;j++){
    
    
                    C[i][j]=A[i][j]+B[i][j];
    
    
                    printf("%d\t\n", C[i][j]);
            }
            }
    
    
            return 0;
    }


  • #2
    Re: Programa de matrices

    Creo que es un problema de capacidad, por hacer matrices de 1000x1000. Por lo menos a mi me funciona si cambio 1000 por 100 en n y m

    Voy a contar una anecdota, ya que estamos en estas

    Un dia el profesor de algebra lineal nos estaba enseñando a usar matlab, y nos pusó a hacer matrices aleatorias de 5x5. Resulta que en una parte en el programa había que colocar 5,5, pero yo en vez de eso puse 5*5, y me salió una matriz de 25x25 que me llenó toda la pantalla , y cuando el profesor la vió me empezó a gritar "!qué hizo!, !usted sí es ordinario! !Hizo una matriz de 1000x1000!", y todos se rieron de mí . fin
    Última edición por javier m; 23/11/2013, 16:51:35.

    Comentario


    • #3
      Re: Programa de matrices

      Una violacion de segmento significa que el programa ha intentado acceder a una zona de memoria que no le pertenece o inexistente.
      Como te ha comentado javier el programa falla porque las matrices son muy grandes, y se salen fuera de la memoria asignada para el programa. Pero no porque el ordenador no tenga esa capacidad. Esas tres matrices ocuparan aproximadamente unos 12 o 48 Megabytes (dependiendo de si sistema operativo/programa es de 32 bits o de 64bits). Es decir poco comparado con la memoria de cualquier ordenador mas o menos actual.
      El problema de fondo es que estas creando las variables dentro de una funcion y en la pila del programa y esta tiene asignado un tamaño maximo, que depende del sistema operativo y/o compilador, pero que suele andar sobre 8 Megabytes.

      Asi que tienes tres opciones:

      1. Aumentar el maximo tamaño de la pila del sistema operativo y/o compilador, y la forma de hacer esto varia segun que sistema operativo y compilador uses.
      2. Crear los arrays fuera de la pila: en memoria dinamica que no tiene ese limite usando la funcion malloc por ejemplo.
      3. Crear los arrays fuera de la pila: en memoria estatica para esto basta mover la definicion de los arrays fuera de la funcion.

      La opcion 3 es la mas sencilla, simplemente la linea:

      int A[n][m], B[n][m], C[n][m];

      Ponla antes del:

      int main(void) {


      PD: Definir las matrices de antemano con el tamaño maximo posible es bastante "bestia" (a mas de uno le sangrarian los ojos si ve un codigo asi :P), lo logico es pedir las dimensiones de las matrices y despues crear las matrices del tamaño acorde con las dimensiones solicitadas.
      Última edición por abuelillo; 23/11/2013, 18:36:36.
       \left\vert{     \Psi_{UNIVERSE}       }\right>  = \sum \alpha_i   \left\vert{     \Psi_{WORLD_i}       }\right> \text{   } \hspace{3 mm}  \sum  \left\vert{} \alpha_i   \right\vert{}^2 = 1

      Comentario


      • #4
        Re: Programa de matrices

        Gracias a los dos, no me había fijado en que el tamaño de las matrices era demasiado grande. Es que en el caso de los vectores suelo poner números altos, y como acabo de empezar con las matrices, pues he hecho lo mismo.
        Escrito por abuelillo Ver mensaje
        PD: Definir las matrices de antemano con el tamaño maximo posible es bastante "bestia" (a mas de uno le sangrarian los ojos si ve un codigo asi :P), lo logico es pedir las dimensiones de las matrices y despues crear las matrices del tamaño acorde con las dimensiones solicitadas.
        Ya, es muy cutre. El problema es que, según tengo entendido, he de poner primero la dimensión de las matrices con el #define y luego preguntar la dimensión. ¿Cómo lo hago para no tener que usar el #define al principio? Cuando dices de crear las matrices, ¿te refieres a declararlas más tarde? ¿Esto se puede hacer?

        Comentario


        • #5
          Re: Programa de matrices

          Escrito por Weip Ver mensaje
          Ya, es muy cutre. El problema es que, según tengo entendido, he de poner primero la dimensión de las matrices con el #define y luego preguntar la dimensión. ¿Cómo lo hago para no tener que usar el #define al principio? Cuando dices de crear las matrices, ¿te refieres a declararlas más tarde? ¿Esto se puede hacer?
          Mejor empieza por la tercera opción que te ha dicho abuelillo, pues para crear arrays cuya dimensión sólo es conocida en tiempo de ejecución se necesitan algunos conocimientos sobre pointers y reserva dinámica de memoria. Es un pelín más avanzado que lo que estás haciendo, así que por ahora no te preocupes.

          Comentario


          • #6
            Re: Programa de matrices

            Escrito por Weip Ver mensaje
            Gracias a los dos, no me había fijado en que el tamaño de las matrices era demasiado grande. Es que en el caso de los vectores suelo poner números altos, y como acabo de empezar con las matrices, pues he hecho lo mismo.

            Ya, es muy cutre. El problema es que, según tengo entendido, he de poner primero la dimensión de las matrices con el #define y luego preguntar la dimensión. ¿Cómo lo hago para no tener que usar el #define al principio? Cuando dices de crear las matrices, ¿te refieres a declararlas más tarde? ¿Esto se puede hacer?
            No se puede hacer exactamente asi, hay que hacerlo de otra manera como ha comentado Zypp.
            No se cual es exactamente el objetivo de esas practicas, si es manipular matrices y puedes elegir el lenguaje, yo escogeria otro lenguaje de mas alto nivel en lugar de C, uno que implemente tipos de datos mas complejos y abstractos, te ahorraras mucho tiempo ya que no tendras que aprender y lidiar con conceptos de programacion de mas bajo nivel.
            Si tienes que utilizar C sin remedio y las practicas tambien tienen el objetivo de profundizar en este lenguaje y en programacion en general, puede que si te convenga programarlo de una forma mas "ortodoxa", mas estructurado para que sea reusable y con punteros y reserva de memoria dinamica. Si fuese este ultimo caso, comentalo y se podria postear algun codigo de ejemplo.
            Última edición por abuelillo; 23/11/2013, 22:35:04.
             \left\vert{     \Psi_{UNIVERSE}       }\right>  = \sum \alpha_i   \left\vert{     \Psi_{WORLD_i}       }\right> \text{   } \hspace{3 mm}  \sum  \left\vert{} \alpha_i   \right\vert{}^2 = 1

            Comentario


            • #7
              Re: Programa de matrices

              Lo tengo que hacer en C, y aún estoy empezando con esto de la programación, así que como dice ZYpp y como bien me has recomendado, optaré por la tercera opción que me has dado. Lo de los punteros aún no lo he visto en clase, solo hemos dado cosas básicas del lenguaje C (un poco de bucles, vectores y ahora matrices). De todas formas gracias por los consejos, cuando llegue el momento me pondré a hacerlo bien (yo mismo reconozco que soy un poco chapucero programando).

              Comentario


              • #8
                Re: Programa de matrices

                Escrito por ZYpp Ver mensaje
                Mejor empieza por la tercera opción que te ha dicho abuelillo, pues para crear arrays cuya dimensión sólo es conocida en tiempo de ejecución se necesitan algunos conocimientos sobre pointers y reserva dinámica de memoria. Es un pelín más avanzado que lo que estás haciendo, así que por ahora no te preocupes.
                En realidad no, basta con usar el estandard c99 y entonces ya puedes usar lo que los ingleses llaman variable size arrays.
                Última edición por l3m0n; 24/11/2013, 17:21:17.

                Comentario


                • #9
                  Re: Programa de matrices

                  Escrito por l3m0n Ver mensaje
                  En realidad no, basta con usar el estandard c99 y entonces ya puedes usar lo que los ingleses llaman variable size arrays.
                  El principal problema con esto es que pocos compiladores (por no decir ningun de los mas usados) implementa el standard C99 completo.
                  Sin contar con que los arrays se crearian igualmente en la pila y el programa seguiria fallando si son demasiado grandes.
                  Última edición por abuelillo; 24/11/2013, 18:26:08.
                   \left\vert{     \Psi_{UNIVERSE}       }\right>  = \sum \alpha_i   \left\vert{     \Psi_{WORLD_i}       }\right> \text{   } \hspace{3 mm}  \sum  \left\vert{} \alpha_i   \right\vert{}^2 = 1

                  Comentario

                  Contenido relacionado

                  Colapsar

                  Trabajando...
                  X