elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con matriz dinámica
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con matriz dinámica  (Leído 3,036 veces)
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Problema con matriz dinámica
« 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.


« Última modificación: 22 Mayo 2013, 18:14 pm por NathanD » En línea

NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: Problema con matriz dinámica
« Respuesta #1 en: 23 Mayo 2013, 14:42 pm »

¿Nadie?


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Problema con matriz dinámica
« Respuesta #2 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|.

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
En línea

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


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Problema con matriz dinámica
« Respuesta #3 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
En línea

Ahorrate una pregunta, lee el man
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Problema con matriz dinámica
« Respuesta #4 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
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Solucionado]Problemilla al acceder a una matriz dinamica
Programación C/C++
yiti007 2 2,990 Último mensaje 8 Mayo 2010, 19:10 pm
por leogtz
Duda - Buscar si existe una matriz dentro de otra matriz
Programación Visual Basic
EddyW 2 6,022 Último mensaje 14 Agosto 2010, 06:18 am
por EddyW
lista con matriz dinamica
Programación C/C++
L·Storm! 2 4,443 Último mensaje 3 Agosto 2011, 03:03 am
por L·Storm!
Expandir matriz dinámica?
Programación C/C++
Metal-byte 2 6,224 Último mensaje 22 Enero 2012, 23:06 pm
por rir3760
Juego con matriz dinámica en c++, función para rrecorrer matriz
Programación C/C++
jajaimess 1 3,957 Último mensaje 21 Junio 2014, 05:21 am
por .:UND3R:.
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines