Problema con matriz dinámica

Iniciado por NathanD, 22 Mayo 2013, 18:09 PM

0 Miembros y 1 Visitante están viendo este tema.

NathanD

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:

typedef struct Matriz{
int f;
int c;
double **m;
}tMatriz;


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


int main()
{      
//Variables
FILE *fichero;
tMatriz *matriz;
char nombre[15];
int cantidad;
int i;
/****************************/

printf("Nombre del fichero: ");
gets(nombre);

if( (fichero= fopen(nombre, "rb") ) == NULL )
{
printf("\nEl fichero no existe. El programa se cerrará...");
Sleep(2500);
exit(1);
}

matriz = (tMatriz*) malloc( 20 * sizeof(tMatriz) );

matriz->m = (double**) malloc( 20* sizeof(double*) );

for(i=0; i < 20; i++)
matriz->m[i] = (double*) malloc( 20* sizeof(double) );


cantidad= fread(matriz, sizeof(tMatriz), 20, fichero);
printf("%d\n", cantidad);    //9
printf("%d\t%d", matriz->c, matriz->f);   //Basura

fflush(stdin);
getchar();

return 0;
}


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.


rir3760

Cita de: NathanD en 22 Mayo 2013, 18:09 PMresulta 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:
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|.

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:
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:
/* Leer un maximo de 20 estructuras *punteros incluidos* */
cantidad = fread(matriz, sizeof(tMatriz), 20, fichero);

/* El numero de filas y columnas de la primera matriz es */
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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

durasno

Hola!
Citarpara 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
Ahorrate una pregunta, lee el man

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language