Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NathanD en 22 Mayo 2013, 18:09 pm



Título: Problema con matriz dinámica
Publicado por: NathanD en 22 Mayo 2013, 18:09 pm
Buenas, resulta que tengo que coger la información de un fichero .dat con la información de una matriz dinámica. Se supone que la estructura empleada es la siguiente:

Código
  1. typedef struct Matriz{
  2. int f;
  3. int c;
  4. double **m;
  5. }tMatriz;

He probado mil formas, pero no consigo coger correctamente la información del fichero. Ésta es la última forma que he probado:

Código
  1. int main()
  2. {      
  3. //Variables
  4. FILE *fichero;
  5. tMatriz *matriz;
  6. char nombre[15];
  7. int cantidad;
  8. int i;
  9. /****************************/
  10.  
  11. printf("Nombre del fichero: ");
  12. gets(nombre);
  13.  
  14. if( (fichero= fopen(nombre, "rb") ) == NULL )
  15. {
  16. printf("\nEl fichero no existe. El programa se cerrará...");
  17. Sleep(2500);
  18. exit(1);
  19. }
  20.  
  21. matriz = (tMatriz*) malloc( 20 * sizeof(tMatriz) );
  22.  
  23. matriz->m = (double**) malloc( 20* sizeof(double*) );
  24.  
  25. for(i=0; i < 20; i++)
  26. matriz->m[i] = (double*) malloc( 20* sizeof(double) );
  27.  
  28.  
  29. cantidad= fread(matriz, sizeof(tMatriz), 20, fichero);
  30. printf("%d\n", cantidad);    //9
  31. printf("%d\t%d", matriz->c, matriz->f);   //Basura
  32.  
  33. fflush(stdin);
  34.  
  35. return 0;
  36. }

El valor de 20 para las filas y columnas es uno elegido al azar.

Cuando imprimo los valores de 'c' y 'f', salen números que no tienen nada que ver con lo que corresponde. Y cuando intento imprimir los valores de la matriz, el programa peta y se cierra.

A ver si me podéis ayudar. Saludos.


Título: Re: Problema con matriz dinámica
Publicado por: NathanD en 23 Mayo 2013, 14:42 pm
¿Nadie?


Título: Re: Problema con matriz dinámica
Publicado por: rir3760 en 23 Mayo 2013, 16:36 pm
resulta que tengo que coger la información de un fichero .dat con la información de una matriz dinámica.
Lo primero que debes indicar es como esta almacenada la información en el archivo de datos ya que ello decide que funciones utilizar para la lectura (fread o fscanf). Supongo es un archivo de texto con el formato:
Código:
3 4
 0.0  1.0  2.0  3.0
10.0 11.0 12.0 13.0
20.0 21.0 22.0 23.0
Los dos primeros valores son el numero de filas y columnas seguidos de cada uno de los valores, texto plano sin chiste. Si es de otra forma debes dar un ejemplo sobre como los guardas.

En cuanto al programa lo primero que debes hacer es evitar el uso de gets y fflush(stdin), las razones se indican en el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

Tampoco puedes concluir, si la llamada a fopen falla, que el archivo no existe ya que la mentada función puede fallar por otras razones (falta de privilegios, falla catastrófica, etc.).

Con esto:
Código
  1. matriz = (tMatriz*) malloc( 20 * sizeof(tMatriz) );
Reservas memoria para veinte matrices, ¿Estas seguro de leer ese numero del archivo? Y en C las conversiones explicitas al tipo apropiado de funciones como malloc, calloc y para el caso cualquier función que retorne un "void *" no son necesarias y no se recomiendan (por ejemplo si no incluyes el encabezado <stdlib.h> esa conversión puede terminar reventando al programa).

Y una matriz (punteros incluidos) no puedes simplemente leerla así del archivo:
Código
  1. /* Leer un maximo de 20 estructuras *punteros incluidos* */
  2. cantidad = fread(matriz, sizeof(tMatriz), 20, fichero);
  3.  
  4. /* El numero de filas y columnas de la primera matriz es */
  5. printf("%d\t%d", matriz->c, matriz->f);   //Basura

De nuevo la forma correcta para leer el numero de filas, columnas y cada valor depende del formato del archivo de datos. Danos un ejemplo.

Un saludo


Título: Re: Problema con matriz dinámica
Publicado por: durasno en 26 Mayo 2013, 02:26 am
Hola!
Citar
para el caso cualquier función que retorne un "void *" no son necesarias y no se recomiendan
podrias explicar un poco mas por que no se recomienda el cast?? lo digo porque, por ejemplo, hay libros que utilizan el cast


Saludos


Título: Re: Problema con matriz dinámica
Publicado por: rir3760 en 31 Mayo 2013, 17:26 pm
No se recomienda porque es innecesaria: en C la conversión de un valor de tipo "void *" a uno de tipo "T *" es automática y eso coloca la conversión al mismo nivel que las palabras reservadas "auto" y "register" (no tiene caso utilizarlas).

Un saludo