Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mariyop en 28 Noviembre 2011, 16:31 pm



Título: Leer matriz por filas y almacenarla por columnas
Publicado por: mariyop en 28 Noviembre 2011, 16:31 pm
Hola a todos!

Llevo varios días liada con una función y no sé qué le pasa. ¿Podéis ayudarme?
Os explico de qué va el tema. Tengo un archivo donde la primera línea contiene el nombre de una matriz, la segunda el número de filas, la tercera el nº de columnas, y después los elementos de la matriz leyéndolas por filas. Lo que necesito es leerla, y almacenarla en un vector con su nombre, en las dos primeras posiciones el tamaño, y después los elementos, pero como si la estuviera leyendo por columnas.

Os pongo un ejemplo:
Es decir, tenemos un matriz 2x3 A=[1 2 3
                                                     4 5 6]

En el archivo aparecerá como:

2
3
1
2
3
4
5
6

Al leerla, quiero que se almacena en un vector A=[2,3,1,4,2,5,3,6]

Y ahora os pongo el trozo de código que utilizo para almacenarla en el vector (la parte de abrir el archivo y todo eso va bien):


fscanf(fp,"%s",nombre);
fscanf(fp,"%lf",&filas);
fscanf(fp,"%lf",&columnas);

if (vect!=NULL){
                        indice=0;
            for(pi=0;pi<(int)columnas;pi++)
               {
                                         for (pj=0;pj<(int)filas;pj++)
                   {
                                                indice=(pj*columnas+pi+2);
                  vect=vect+indice;
                  fscanf(fp,"%lf",vect);

                    }
               }
         }


Al final lo único que me escribe es  2, 3, 1, 0, 0, 0, 0, 0. ¿Sabéis por qué escribe sólo el tamaño y el primer elemento? He ido comprobando el valor de la variable "indice" con el debugger y lo hace bien. Imagino que debe ser algo del puntero, pero no doy con el problema.


Título: Re: Leer matriz por filas y almacenarla por columnas
Publicado por: rir3760 en 28 Noviembre 2011, 17:50 pm
Para ayudarte lo mejor es que publiques el codigo fuente del programa completo o al menos las partes donde declaras las variables y realizas las operaciones de lectura y escritura.

Asi a primera vista no se ve bien el fragmento ya que por algun razon lees el numero de filas y columnas como tipo "double" y despues utilizas contadores de tipo "int".

Y si es un solo bloque de memoria no necesitas de dos bucles, basta con uno, mas o menos asi:
Código:
for (i = 0; i <filas * columnas; i++)
   fscanf(fp, "%lf", vect + i);

Pero de nuevo para sacarte de dudas mejor publica el codigo fuente completo.

Edito:

Por alguna (extraña) razon debes procesar columna por columna en lugar de lo usual que es por filas. En ese caso:
Código:
for (i = 0; i < columnas; i++){
   for (j = 0; j < filas; j++)
      fscanf(fp, "%lf", vect + i + (j * columnas));

Un saludo